nodejs 前后端分离的实现 本地相册实例

本地相册功能,前端是bootstrap.js+underCore.js+jq,后端是nodejs:exress,结构是mvc,v是直接静态呈现,数据交互用的是ajax,

贴下github地址有兴趣的可以自己下载:https://github.com/rainningLovexiang/CSDN/tree/photoAlbum

看下目录

 

首先是

app.js,这是主方法

var express=require("express");
var app =express();

var router=require("./controller/router.js");
//注册模板引擎
app.set("view engine","ejs");

//利用 Express 托管静态文件
//路由中间件,静态页面
app.use(express.static("./public"));
app.use(express.static("./public/html"));
app.use(express.static("./public/js"));
app.use(express.static("./public/css"));
app.use(express.static("./public/images"));
app.use(express.static("./uploads"));

//首页页面跳转
app.get("/",router.showIndex);
//获取文件夹内所有文件夹及图片
app.get("/indexContent",router.getIndexContain);
//获取所有文件夹名称
app.get("/albumsFilesName",router.getAlbumsFilesName);
//上传数据
app.post("/upLoadsImage",router.upLoadsImage);
//监听3000端口及IP
app.listen(3000,"127.0.0.1");

然后是controller里面的router.js这个作为控制层

//引包
var file = require("../model/file");
var formidable = require('formidable');
var path = require("path");
var fs = require("fs");
var sd = require("silly-datetime");
var rd = require("rd");

//跳转首页的方法
exports.showIndex = function (req, res) {
    //redirect:重定向到首页(静态资源)
    res.redirect("/main.html")
}
//获取当前文件夹所有的资源
exports.getIndexContain = function (req, res, next) {
    //console.log(req);

    console.log(req.query);
    var albumPath = req.query.albumPath;
    console.log(albumPath);
//获取所有文件具体方法:nodejs 所有的方法以异步回调为主,(在可以异步的情况下不要同步)
    file.getAllphotoAlbums(albumPath, function (allblums) {
        res.json(allblums)
    })
}
//获取文件夹目录集合(自写方法)
exports.getAlbumsFilesName = function (req, res) {
    file.getAllphotoAlbumsName(function (allblumsFiles) {
        res.json(allblumsFiles)
    })
}
//获取文件夹目录集合(调用已经有的包)
exports.getAlbumsFilesName1 = function (req, res) {
    // file.getRD(function (allblumsFiles) {
    //   res.json(allblumsFiles)
    //})
    // 异步列出目录下的所有文件
    rd.read('./uploads', function (err, files) {
        if (err) throw err;
        // files是一个数组,里面是目录/tmp目录下的所有文件(包括子目录)
        // console.log(files);
        var newFiles = [];
        console.log(files);
        for (var i = 1; i < files.length; i++) {
            var file = (files[i].replace(/\\/g, "/"))
            if (file.indexOf(".") == -1) {
                newFiles.push(file.slice(file.indexOf("uploads/") + 8))
            }
        }
        console.log(newFiles);
        res.json(newFiles)
    });
}
//post 上传图片及数据
exports.upLoadsImage = function (req,res) {
    var form = new formidable.IncomingForm();
    console.log("------------1----------1");
    form.uploadDir = path.normalize(__dirname+"/../tempFile/");
    console.log("-----------3----------1");
    form.parse(req, function(err, fields, files,next) {
        if(err){
            next();
            return;
        }
        console.log(files);
        var size=parseInt(files.pic.size);
       /* if(size>102400){
            res.send("图片尺寸应该小于1M");
            fs.unlink(files.pic.path,function (err) {

            });
            return;
        }*/

        var wenjianjia=fields.albumsFilesName;

        console.log("wenjianjia");
        console.log(wenjianjia);
        var oldPath=files.pic.path;
        console.log("oldPath");
        console.log(oldPath);
        var ttt=sd.format(new Date(),'YYYYMMDDHHmmss');
        ran=parseInt(Math.random()*89999+100000);
        var extname=path.extname(files.pic.name);
        var newPath=path.normalize(__dirname+"/../uploads/"+wenjianjia+"/"+ttt+extname)
        fs.rename(oldPath,newPath,function(err){
            if(err){
                res.send("改名失败")
                return;
            }
            console.log("Error renaming file:", err );
          //  res.send("成功")
            res.redirect("/main.html?albumPath=/"+wenjianjia)

        })
        console.log(fields)
        console.log(files)
    });
}

model下的file.js

var fs = require("fs");
//获取当前目录下的数据
exports.getAllphotoAlbums = function (albumPath, callback) {
    console.log("albumPath")
    console.log(albumPath)
    fs.readdir("./uploads" + albumPath, function (err, fils) {
        if (err) {
            console.log(err);
            return;
        }
        console.log(fils);
        callback(fils);
        return;
    })
}
//获取总目录下所有子目录集合(深度遍历)
exports.getAllphotoAlbumsName = function (callback) {
console.log("#########################Start#############################")
    var recursionNum = 0;
    var allAlbums = [];
    var recursionArr=[];
    recursionArr.push([]);
    (function interator(pathName, ablumsName) {

        fs.readdir("./uploads/" + pathName + ablumsName, function (err, fils) {

            if (err) {
                console.log(err);
                return;
            }
            console.log(fils);
           // recursionArr[recursionArr.length]=fils.length;
            console.log(recursionArr);
            for(var j=0;j<recursionArr.length;j++){
                if(recursionArr[j].length==0) {
                    (recursionArr[j].push(fils.length))
                    break;
                }

            }
            console.log(recursionArr);
            console.log(recursionNum);
            console.log(fils.length);
            recursionNum =recursionNum + fils.length;


            console.log("recursionNum++++++++++++++++");
            console.log(recursionNum);
            (function interator2(fils, i, filsUrl) {
                if (fils.length != 0) {

                    fs.stat("./uploads" +"/"+ filsUrl + "/" + fils[i], function (err, stats) {


                        if (stats.isDirectory()) {

                          //  var curfilsUrl = filsUrl + (fils[i] ? "/" + fils[i] : "");
                            var curfilsUrl = filsUrl + (filsUrl?"/" + fils[i]:fils[i]);
                            console.log(curfilsUrl)
                            allAlbums.push(curfilsUrl);
                            //allAlbums[0].push(fils[i]);
                            recursionArr.push([]);
                            interator(curfilsUrl, "")
                        }
                        i++;
                        recursionNum-=1;
                        console.log("recursionNum------------------");
                        console.log(recursionNum);
                        if (i < fils.length) {

                            interator2(fils, i, filsUrl)

                        } else {
                        }
                        console.log("end"+recursionArr[recursionArr.length-1].length);
                        if(recursionNum==0&&recursionArr[recursionArr.length-1].length!=0){

                            console.log("recursionArr[recursionArr.length]");
                            console.log(recursionArr[recursionArr.length-1].length);
                            console.log("----------------------callback(allAlbums);--------interator2-------------")
                            callback(allAlbums);
                            return;
                        }else{

                        }


                    });


                }

                if(recursionNum==0&&recursionArr[recursionArr.length-1].length!=0){

                    console.log("recursionArr[recursionArr.length]");
                    console.log(recursionArr[recursionArr.length-1].length);
                    console.log("----------------------callback(allAlbums);----interator-----------------")
                    callback(allAlbums);
                    return;
                }else{

                }
            })(fils, 0, pathName)


        })


    })("", "");


}

前端项目可以自行去看,前端都不是很难。有难得可以沟通。

主要实现了两个功能一个查看,一个上传,没有做新建文件夹的功能。对初级学习node的可以好好看下,尤其是自己写的深度递归遍历文件夹。还是有一点点难度。共勉。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值