当执行mysql insert 时插入两条是怎么回事?

Eason_____________ 2013-07-25 11:24:30
//做了一个手机上传图片到服务器的功能。但是获取到执行insert语句时都要执行两次!

//index.php

<?php
header("Content-Type: text/html; charset=UTF-8");
mysql_connect("localhost","dome_huayan","e2k3e6b8");
mysql_select_db("dome_huayan");
mysql_query("set names utf8");

include 'uploadImage.php';
$gettitle=$_GET['title'];
$getcontent=$_GET['content'];
$i = new uploadImage($_FILES['filename'],'./img/');
$i->doWork();
$i->imageCheck();

$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','".$i->iamgePath."','".time()."','')";
mysql_query($sql);
?>


//uploadImage.php


<?php
/**
*
* 图片上传类
* @author ChenYue
*
* @param $mageStauts 图片上传状态 1为正常状态
* @param $iamgePath 图片上传成功保存在数据库的路径
* @param $imagePathTemp 临时保存图片上传成功保存在数据库的路径
* @param $destination_folder 上传文件路径
* @param $imageName 上传的图片名(可自定义)
* @param $fileArray 上传的图片信息数组
* @param $updateImage 判断是否更新原有图片 0表示不更新 , 1 表示更新
* @param $uptypes 支持上传的图片类型
* @param max_file_size 支持上传的图片最大类型
* @param imageType 图片的类型
*
*/
class uploadImage{

public $imageStauts = 1;
public $iamgePath='';
public $imagePathTemp = "";
private $destination_folder;
private $imageName;
private $fileArray;
private $updateImage = 0;
private $uptypes = array(
'image/jpg',
'image/jpeg',
'image/png',
'image/x-png');

private $imageType = array('jpg','jpeg','png');
const max_file_size=2000000;


/**
* 构造函数
* @param $file 上传的图片信息数组
* @param $destination 上传文件路径
* @param $name 上传的图片名(可自定义)没定义,上传后的图片名为time()
* @param $dbPath 图片上传成功保存在数据库的路径
* @param $update 判断是否更新原有图片 0表示不更新 , 1 表示更新 。 更新会把已经存在的图片替换掉
*/

function __construct($file,$destination="",$name="",$dbPath="",$update=0){

if(strtolower($_SERVER['REQUEST_METHOD']) != 'post'){
$this->imageStauts = 'Error! Wrong HTTP method!';
}
if(is_array($file) && count($file)>0 && !empty($destination)){
$this->fileArray = $file;
$this->destination_folder = $destination;
$this->imageName = $name;
$this->imagePathTemp = $dbPath;
$this->updateImage = $update;
}else{

$this->imageStauts = '初始化失败';

}

}


/**
* 开始图片上传
*/
function imageStart(){
if($this->imageStauts === 1){
$this->imageCheck();

}
if($this->imageStauts === 1){
$this->doWork();
}
}
/**
*
* 图片的检查工作
*/
function imageCheck(){
$file = $this->fileArray;
//print_r($file);
if(!is_uploaded_file($file['tmp_name']) && $this->imageStauts === 1){
$this->imageStauts = '图片不存在!';

}

if(uploadImage::max_file_size < $file['size'] && $this->imageStauts === 1){
$this->imageStauts = '文件太大';
}
/*
//检查mime-type
if(!in_array(strtolower($file['type']), $this->uptypes) && $this->imageStauts === 1){
$this->imageStauts = '不支持 '.$file['type'].' 类型的文件';
}
*/
//防止在图片元数据的Comment字段中加入了php代码
//通过二进制匹配检查
$fileInfo = pathinfo($this->fileArray['name']);
$fileType = strtolower($fileInfo['extension']);
if(!in_array($fileType, $this->imageType) && $this->imageStauts === 1){
$this->imageStauts = '不支持 '.$fileType.' 类型的文件';
}

if(!file_exists($this->destination_folder) && $this->imageStauts === 1){
mkdir($this->destination_folder,0777);//设置文件权限
}
}
/**
*
* 开始图片上传的工作
*/
function doWork(){

$fileName = $this->fileArray['tmp_name'];
$fileSize = getimagesize($fileName);
$fileInfo = pathinfo($this->fileArray['name']);
$fileType = strtolower($fileInfo['extension']);
$n = !empty($this->imageName) ? $this->imageName : date("Y_n_d_H_i_s");
$destination = $this->destination_folder.$n.'.'.$fileType;//图片本地路径
$this->imagePathTemp = $this->imagePathTemp.$n.'.'.$fileType;//将要保存在数据库的路径

//上传图片,若图片存在不更新已有图片
if(file_exists($destination) && $this->imageStauts === 1 && $this->updateImage == 0){
$this->imageStauts = '图片已存在';
}

//上传图片,若图片存在更新已有图片
if($this->imageStauts === 1 && $this->updateImage == 1){
$deleteIMageDestination = $this->destination_folder.$n; //图片保存本地路径,包含文件名,但不包含图片后缀名
if($this->deleteImage($deleteIMageDestination)){
}else{
$this->imageStauts = '删除已存在图片失败';
}
}

if(!move_uploaded_file($fileName, $destination) && $this->imageStauts === 1){
$this->imageStauts = '传输错误';
}

if($this->imageStauts === 1){
$this->iamgePath = $this->imagePathTemp;
return $this->imageStauts;
}


}

/**
* 删除图片
* @param $path 图片在本地的保存路径
* @return 成功返回1 失败返回0
*/
function deleteImage($path){
if(!empty($path)){
foreach($this->imageType as $type){
$_path = $path.'.'.$type;
if(file_exists($_path)){
//echo $_path;
if(!unlink($_path)){
$this->imageStauts = '删除已存在图片失败';
return 0;
}
}

}
return 1;
}else{
$this->imageStauts = '待删除图片路径不能为空';
return 0;
}
}


}

?>
...全文
555 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackkettle 2013-07-26
  • 打赏
  • 举报
回复
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 15 楼 xuzuning 的回复:
你的文字提交和文件上传本身就是分开的
现在插入两条的问题解决了 就是插入的时候 获取不到$i->iamgePath的值。 但是当insert 是两条的时候 $i->iamgePath就会有。
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 15 楼 xuzuning 的回复:
你的文字提交和文件上传本身就是分开的
嗯 这是我用appcan做的手机app.
xuzuning 2013-07-25
  • 打赏
  • 举报
回复
你的文字提交和文件上传本身就是分开的
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 12 楼 ohmygirl 的回复:
[quote=引用 11 楼 ohmygirl 的回复:] [quote=引用 9 楼 Eason_____________ 的回复:] [quote=引用 8 楼 xuzuning 的回复:] 看看你的表单
[/quote] 斑竹说表单,你给数据库。。 是表单部分的代码和js部分的代码。[/quote] ajax? 传递过来不就执行insert了么? 提交表单又执行一次。 不就刚好两条数据么[/quote] 如果我判断一下 就是 if($_GET["title"]!=''){ } 就执行了一次。 但是插入的数据 $i->iamgePath的值就为空 这个是怎么回事?
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 9 楼 Eason_____________ 的回复:
[quote=引用 8 楼 xuzuning 的回复:] 看看你的表单
[/quote]

<!DOCTYPE html>
<html class="um landscape min-width-240px min-width-320px min-width-480px min-width-768px min-width-1024px">
  <head>
    <title>
    </title>
    <meta charset="utf-8">
    <meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <link rel="stylesheet" href="css/ui-input.css">

    <link rel="stylesheet" href="css/ui-btn.css">
    <link rel="stylesheet" href="css/ui-img.css">
    <link rel="stylesheet" href="css/ui-list.css">
    <link rel="stylesheet" href="css/ui-res.css">
    <link rel="stylesheet" href="css/ui-fold.css">
    <link rel="stylesheet" href="css/ui-base.css">
    <link rel="stylesheet" href="css/ui-box.css">
    <link rel="stylesheet" href="css/ui-color.css">
    <script src="js/zy_anim.js">
    </script>
    <script src="js/zy_control.js">
    </script>
 	<script src="js/zy_tmpl.js">
    </script>
	<script src="js/zy_click.js">
    </script>
	<script src="js/zy_json.js">
    </script>
    </head>
  
<body class="um-vp" ontouchstart>
<div class="btm" id="yinying" style="display:none"></div>
<div class="c-wh" id="fb_content">    	 

    <!--文本开始-->
    <div class="ub t-bla ulab">  
    <div class="ub-f1 c-wh uba uc-a1 b-gra us-i uinput uinn4" style="margin-top:5%">  
    <input placeholder="标题..."  type="text" name="title" class="uc-a1" id="fb-title">   
    </div>
    </div>
    <!--文本结束-->

    <!--文本开始-->
    <div class="ub t-bla ulab fb-btn">  
    <div class="ub-f1 c-wh uba uc-a1 b-gra us-i uinput uinn4">  
    <textarea  placeholder="请输入内容"  name="content" rows="7" id="fb-content" ></textarea>
    </div>
    </div>
    <!--文本结束-->


    <div style=" display:none; width:20%; height:15%; margin-top:5%; left:1%" id="show_img">
    	<span class="del" onClick="del()">x</span>
        <img style="width:100%; height:100%;display:block; border:1px solid #CCC;" src="" id="showPic" />        
    </div>

	<!--按钮开始-->
    <div ontouchstart="zy_touch('btn-act')" class="btn uba b-bla uinn5 c-blu1 c-m2 uc-a1 t-wh img-add"  onclick="picSeclet();" id="selectPic">添加图片</div>
	<!--按钮结束-->
    
	<!--按钮开始-->
    <div ontouchstart="zy_touch('btn-act')" class="btn uba b-bla uinn5 c-blu1 c-m2 uc-a1 t-wh img-add" onClick="upload()">发布</div>
	<!--按钮结束-->

    <div style="position:absolute; bottom:0; width:100%; z-index:100; display:none" id="divPic"> 
            <div ontouchstart="zy_touch('c-m2');" data-role="button" onclick="uexImageBrowser.pick();" class="btn uba b-bla uinn5 c-bla c-m1 uc-a1 t-wh img-add1"> 
                    <span class="ui-btn-inner ui-btn-corner-all"> 
                    <span class="ui-btn-text t-wh">从手机相册选择</span> 
                    </span>
            </div> 
            <div ontouchstart="zy_touch('c-m2');" data-role="button" onclick="uexCamera.open();" class="btn uba b-bla uinn5 c-bla c-m1 uc-a1 t-wh img-add1"> 
                    <span class="ui-btn-inner ui-btn-corner-all"> 
                    <span class="ui-btn-text t-wh">拍照</span> 
                    </span>
            </div>
            <div ontouchstart="zy_touch('c-m2');" data-role="button" onclick="picClose();" class="btn uba b-bla uinn5 c-bla c-m1 uc-a1 t-wh img-add1"> 
                    <span class="ui-btn-inner ui-btn-corner-all"> 
                    <span class="ui-btn-text t-wh">取消</span> 
                    </span>
            </div>
    </div>

</div>
</body>
<script>
zy_init();
window.uexOnload=function(type)
{
	if(!type){
		uexWindow.setBounce("1");
		uexWindow.showBounceView("0","#FFF","0");
		uexWindow.showBounceView("1","#FFF","0");
	}
}
        var uploadHttp = "http://www.huayan.cd/json/bbs/index.php";
        function setLog(msg){
                document.getElementById("msgid").innerHTML = msg;
        }
        function upload(){
				if($$("fb-title").value=='' || $$("fb-content").value==''){
					alert("标题或内容不能为空");
				}else{
					uexUploaderMgr.createUploader(1,uploadHttp);
					var fbtitle = $$("fb-title").value;
					var fbcontent = $$("fb-content").value;
					var url = 'http://localhost/json/bbs/index.php?title='+fbtitle+'&content='+fbcontent;
					$.getJSON(url,function(data){
						alert(data.title);
						alert(data.content);
						alert(data.time);
						alert(data.time1);
					});
				}
        }
        function picSeclet(){
                document.getElementById("yinying").style.display = "block";
                document.getElementById("divPic").style.display = "block";
        }
        function picClose(){
                document.getElementById("yinying").style.display = "none";
                document.getElementById("divPic").style.display = "none";
        }
        function del(){
                document.getElementById("show_img").style.display = "none";
                document.getElementById("showPic").src = "";
        }
        var upload_image_url = "";
        window.uexOnload = function(){
                uexCamera.cbOpen = function(opCode, dataType, data){
                        upload_image_url = data;
                        document.getElementById("showPic").src = data;
                        document.getElementById("show_img").style.display = "block";
                        document.getElementById("divPic").style.display = "none";
						document.getElementById("yinying").style.display = "none";
                }
				
                uexWidgetOne.cbError = function(opCode, errorCode, errorInfo){
                        setLog(errorInfo);
                }
                
                uexImageBrowser.cbPick=function (opCode,dataType,data){
		        if(dataType==0){
									upload_image_url = data;
	              				document.getElementById("showPic").src = data;
									document.getElementById("show_img").style.display = "block";
									document.getElementById("yinying").style.display = "none";
									document.getElementById("divPic").style.display = "none";
		        }
	           }
	
                uexUploaderMgr.cbCreateUploader =function(opCode,dataType,data){
                        if(data == 0){        
                                uexUploaderMgr.uploadFile(1,upload_image_url,"filename",4);        
                                uexWindow.toast(1,5,"图片上传中...",0);
                        }else{
                        }
                        
                }
				
                uexUploaderMgr.onStatus = function(opCode,fileSize,percent,serverPath,status){
                        switch (status) {
                                        case 0:
                                                break;
                                        case 1:
                                                uexWindow.closeToast();//关闭提示消息框
                                                uexWindow.toast(0,5,"发布成功!",2000);
                                                //uexWindow.closeToast();//关闭提示消息框
                                                uexUploaderMgr.closeUploader(1);
                                                break;
                                        case 2:
                                                uexWindow.closeToast();//关闭提示消息框
                                                uexWindow.toast(0,5,"出错啦~",2000);
                                                uexUploaderMgr.closeUploader(1);
                                                break;

                        }
                        
                }
        }
</script>
</html>
ohmygirl 2013-07-25
  • 打赏
  • 举报
回复
引用 11 楼 ohmygirl 的回复:
[quote=引用 9 楼 Eason_____________ 的回复:] [quote=引用 8 楼 xuzuning 的回复:] 看看你的表单
[/quote] 斑竹说表单,你给数据库。。 是表单部分的代码和js部分的代码。[/quote] ajax? 传递过来不就执行insert了么? 提交表单又执行一次。 不就刚好两条数据么
ohmygirl 2013-07-25
  • 打赏
  • 举报
回复
引用 9 楼 Eason_____________ 的回复:
[quote=引用 8 楼 xuzuning 的回复:] 看看你的表单
[/quote] 斑竹说表单,你给数据库。。 是表单部分的代码和js部分的代码。
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 6 楼 ohmygirl 的回复:
[quote=引用 4 楼 Eason_____________ 的回复:] [quote=引用 3 楼 jordan102 的回复:] index.php 代码就只有这些? 是不是执行后又刷新了?跳转了?
还有就是js传过来的 title 和 content [/quote] js传来的title和content?怎么传递的 会不会js传递时执行了脚本,提交上传图片时又执行了insert。所以是两条记录?[/quote] json传递的
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
看看你的表单

xuzuning 2013-07-25
  • 打赏
  • 举报
回复
看看你的表单
  • 打赏
  • 举报
回复
引用 5 楼 Eason_____________ 的回复:
[quote=引用 3 楼 jordan102 的回复:] index.php 代码就只有这些? 是不是执行后又刷新了?跳转了?
如果判断一下index.php

if($_GET['title']!=''){
$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','".$i->iamgePath."','".time()."','')";
mysql_query($sql);
}
在执行的话 就只插入一条数据了,但是获取不到$i->iamgePath的值,$i->iamgePath就为空。 不判断的话 是插入以下两条数据: id title content images time uid 127 aaa yyyyy 1374722311 0 128 2013_7_25_11_18_32.jpg 1374722312 0 [/quote] 你这个一看就是2个不同操作执行得到的插入 你这2个动作,一个应该是更新动作,应该说是后来执行的那个动作只能是更新动作,不能是插入动作 所以你本身逻辑上出现了问题,插入2条数据属于正常的
ohmygirl 2013-07-25
  • 打赏
  • 举报
回复
引用 4 楼 Eason_____________ 的回复:
[quote=引用 3 楼 jordan102 的回复:] index.php 代码就只有这些? 是不是执行后又刷新了?跳转了?
还有就是js传过来的 title 和 content [/quote] js传来的title和content?怎么传递的 会不会js传递时执行了脚本,提交上传图片时又执行了insert。所以是两条记录?
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 3 楼 jordan102 的回复:
index.php 代码就只有这些? 是不是执行后又刷新了?跳转了?
如果判断一下index.php

if($_GET['title']!=''){
$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','".$i->iamgePath."','".time()."','')";
mysql_query($sql);
}
在执行的话 就只插入一条数据了,但是获取不到$i->iamgePath的值,$i->iamgePath就为空。 不判断的话 是插入以下两条数据: id title content images time uid 127 aaa yyyyy 1374722311 0 128 2013_7_25_11_18_32.jpg 1374722312 0
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 3 楼 jordan102 的回复:
index.php 代码就只有这些? 是不是执行后又刷新了?跳转了?
还有就是js传过来的 title 和 content
一起混吧 2013-07-25
  • 打赏
  • 举报
回复
index.php 代码就只有这些? 是不是执行后又刷新了?跳转了?
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
求帮忙看看!
Eason_____________ 2013-07-25
  • 打赏
  • 举报
回复
引用 19 楼 chinmo 的回复:
[quote=引用 17 楼 Eason_____________ 的回复:] [quote=引用 15 楼 xuzuning 的回复:] 你的文字提交和文件上传本身就是分开的
现在插入两条的问题解决了 就是插入的时候 获取不到$i->iamgePath的值。 但是当insert 是两条的时候 $i->iamgePath就会有。[/quote] 给你一个思路和建议,其实不少网站也在用,就是: 上图图片部分用iframe,在ajax提交的是时候先执行上图图片部分,然后得到返回正常的图片地址(这里还不插入数据库,纯粹上传图片)以后再执行再执行文字表单部分,这时候图片地址是用一个参数传,这样就可以和文字一起插入数据库了,也就只有一条数据了[/quote] 谢谢两位版主给的思路。 我在试一试
  • 打赏
  • 举报
回复
引用 17 楼 Eason_____________ 的回复:
[quote=引用 15 楼 xuzuning 的回复:] 你的文字提交和文件上传本身就是分开的
现在插入两条的问题解决了 就是插入的时候 获取不到$i->iamgePath的值。 但是当insert 是两条的时候 $i->iamgePath就会有。[/quote] 给你一个思路和建议,其实不少网站也在用,就是: 上图图片部分用iframe,在ajax提交的是时候先执行上图图片部分,然后得到返回正常的图片地址(这里还不插入数据库,纯粹上传图片)以后再执行再执行文字表单部分,这时候图片地址是用一个参数传,这样就可以和文字一起插入数据库了,也就只有一条数据了
加载更多回复(1)
打开链接下载源码: https://pan.quark.cn/s/589796089f72 C++课程设计任务列表,涵盖以下内容:1、识别并显示10至99范围内,各位数乘积超过各位数和的数值,例如数字12不满足条件,因为1乘以2小于1加2,故不输出;而数字27满足条件,因为2乘以7大于2加7,因此需要输出该数。2、开发一个功能,用于从用户输入的任意数量实数中找出最大值与最小值:首先要求用户输入一个正整数n,代表数值的个数,随后用户可输入任意n个实数,程序需找出这n个数中的最大值和最小值并将它们展示出来。3、实现两个已排序数组的合并操作:设有数组A和B,且假设这两个数组的元素均已按照降序排列。编写程序将A和B合并成一个新的数组C,并确保C中的元素同样保持降序排列。int A[10]={123, 86,80, 49,33,15,7,0,-1,-3};int B[10]={100,64,51,50,27,19,15,12,5,2};4、设计一个函数,用于计算特定分数序列前n项的总和,该序列为1/2,1/3,1/4,1/5,1/6,1/7,...。要求在主程序中提示用户输入一个整数n,并验证输入的合法性(n需大于1方为有效),若输入合法,则调用求和函数并显示计算结果。5、编写一个程序,计算两个用户输入日期之间的天数差:用户需以year1,month1,day1和year2,month2,day2的格式输入两个日期,程序随后计算这两个日期之间的天数间隔,并将结果输出到屏幕上。要求编制具有如下原型的函数difs2Date:long GetDayDifference(int y1,int m1,int d1,int y2,int m2,int d2);并在主函数中调用此函数,将计...
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务数据,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...
源码链接: https://pan.quark.cn/s/a4b39357ea24 小程序雷达 AI 驱动的小程序生态选型与风险评估工具,把微信小程序开发资源转化为可筛选、可评估、可对比的技术雷达。 线上地址 主站: Vercel: 适合谁 正在做微信小程序技术选型的产品、研发和架构团队。 需要判断 Taro、uni-app、原生小程序、组件库、云开发和 SDK 风险的团队。 需要把历史 awesome 列表转成可筛选、可对比、可验证技术雷达的维护者。 可以做什么 Radar:按推荐状态、风险等级、资源类型、分类和适用场景浏览小程序生态资源。 Quick Search:快速搜索资源并跳转常用页面。 Compare:对比 Taro、uni-app、原生小程序等核心方案。 Advisor:输入选型问题,获得推荐结论、适用/不适用条件、迁移成本、下一步和证据来源。 Doctor:粘贴小程序项目配置,识别框架依赖、过方案和迁移风险。 Weekly:查看小程序生态周报和近期风险信号。 数据概览 当前数据集中包含 236 个小程序生态资源。 完整资源可在 Radar 页面和导出能力中查看。 核心样例 Taro ★30.6k+ - 使用 React 的方式开发小程序的框架,同支持生成多端应用 uni-app ★36.1k+ - 使用 Vue 语法开发小程序、H5、App的统一框架 MPX ★2.1k+ - 增强型小程序框架,深度性能优化,支持跨小程序平台开发,完全兼容原生小程序组件 WePY ★21.7k+ - 支持组件化的小程序开发框架 vant-weapp ★12.3k+ - 高颜值、好用、易扩展的微信小程序 UI 库 tdesign-miniprogram ★1.3...

21,889

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧