编程大白话之-CMS内容管理系统应用案例一

某网解释
CMS是"Content Management System"的缩写,意为"内容管理系统"。 内容管理系统是企业信息化建设电子政务的新宠,也是一个相对较新的市场。对于内容管理,业界还没有一个统一的定义,不同的机构有不同的理解。

这里跟大家来分享一个小案例的应用,对于编程初学者是一个不错的案例。
由于案例分为几个页面,所以这里也将分为几个篇章分别给大家分享!

登录页

1.gif

需求内容:
首页:

  1. 预登陆:登录账户,如果存在直接进入,如果不存在提示错误信息。
  2. 注册:如果用户存在返回提示信息,不存在时添加用户。
  3. 登录:注册成功后登录,跳转至个人信息页面。

html

<body>
    <div class="index-container">
        <nav>
            <div class="header">
                <span>产品管理员</span>
                <ul>
                    <li>
                        <a href="/">
                            <span class="iconfont">&#xeb94;</span>
                            <span>仪表板</span>
                        </a>
                    </li>
                    <li>
                        <a href="#">
                            <span class="iconfont">&#xe647;</span>
                            <span>报告
                                <i class="iconfont icon">&#xe62c;</i>
                            </span>
                        </a>
                    </li>
                    <li>
                        <a href="#">
                            <span class="iconfont">&#xf0179;</span>
                            <span>制品</span>
                        </a>
                    </li>
                    <li>
                        <a href="/personal">
                            <span class="iconfont">&#xe678;</span>
                            <span>账号</span>
                        </a>
                    </li>
                    <li>
                        <a href="#">
                            <span class="iconfont">&#xe706;</span>
                            <span>设置</span>
                        </a>

                    </li>
                </ul>
                <div class="header-rigth">
                    <span>管理员,退出</span>
                </div>
            </div>
        </nav>
    </div>
    <div class="register">
        <div class="register_continer">
            <div class="register_title">
                <h4>
                    <b>欢迎来到仪表板,登录</b>
                </h4>
            </div>
            <div class="username">
                <p>用户名</p>
                <input type="text" name="username" id="username">
                <p>密码</p>
                <input type="text" name="password" id="password">
                <button type="submit" id="login">
                    <b>登录</b>
                </button>
                <button type="submit" id="register">
                    <b>注册</b>
                </button>
            </div>
        </div>
    </div>
    <script src="../js/ajax.js"></script>
    <script>
        function $(id) {
            return document.getElementById(id);
        }
        let usernameVl = $('username');
        let passwordVl = $('password');

        // 注册按钮
        $('register').addEventListener('click', () => {
            ajax('/v1/post/register', {
                username: usernameVl.value,
                password: passwordVl.value
            }, function (data) {
                console.log(data);
            })
        });


        // 登录按钮
        $('login').addEventListener('click', () => {
            ajax('/v1/post/login', {
                username: usernameVl.value,
                password: passwordVl.value
            }, function (data) {
                data = JSON.parse(data);
                if (data.status === 0) {
                    location.href = data.redirect;
                } else {
                    console.log(data);
                }
            })
        })
    </script>
</body>

配置的文件

// 配置文件

module.exports = {
    port: 3004,
    database: {
        host: 'localhost',
        port: 3306,
        user: 'root',
        password: 'root',
        database: 'cms2'
    }
}

封装的ajax

// 用户登录注册的ajax
function ajax(url, data, callback) {
    let xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4 && xhr.status === 200) {
            callback && callback(xhr.responseText);
        }
    }
    xhr.open('POST', url);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.send(JSON.stringify(data));
}


// 上传图片的ajax
function filePost(url, fileData, callback) {
    let xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4 && xhr.status === 200) {
            callback && callback(xhr.responseText);
        }
    }
    xhr.open('POST', url);
    xhr.send(fileData);
}

设置服务器

const Koa = require('koa');

const koaStatic = require('koa-static'); // 引静态文件   

const koaViews = require('koa-views'); // 动态渲染修改url路径

const path = require('path');

const requireDie = require('require-directory');

const Router = require('koa-router');

const bodyP = require('koa-bodyparser');

const router = new Router();

const app = new Koa();

const {port} = require('./config');

app.use(koaStatic(path.join(__dirname, './pulic')));    // 读取静态文件

app.use(koaViews(path.join(__dirname, './pulic/html'), { // 视图渲染,配合GET修改URL
    extension: 'html'
}));

app.use(bodyP());

// 自动挂载路由
requireDie(module, './routers', {visit: (modules) => {
    if(modules instanceof Router) {
        app.use(modules.routes());
    }
}});


app.listen(port, () => {
    console.log('scuess:' + port);
})

创建数据库

// 连接数据库

const mysql = require('mysql');

const { database } = require('../config');        // 接收抛出的配置文件

const connection = mysql.createConnection({     // 将接收到的对象进行赋值,或...database直接将对象进行解构
    host: database.host,
    port: database.port,
    user: database.user,
    password: database.password,
    database: database.database
});            // 创建连接,配置参数

connection.connect((err) => {       // 执行测试一下,是否运行
    console.log(err, '是否成功');
})

// 查询数据:根据传入的参数查询数据库
async function find(opt) {          // 接收到传来的数据执行函数内容
    let sql = 'SELECT * FROM `userlist3` WHERE' + Object.keys(opt).map(key => {        // 将opt的内容转为数组,通过map循环,将里面的key值转为数据库查询的格式 
        return ` ${key} LIKE '${opt[key]}' `;               // 复制时要将内容里的%删除,否则会将匹配到相关的内容全部返回出去
    }).join('AND ');            // 将每一个key之间用AND进行拼接

    return new Promise((resolve, reject) => {
        connection.query(sql, (err, result) => {
            if (err) {
                reject(err);                // 有错误执行错误
            } else {
                resolve(result);            // 返回结果给路由的find()
            }
        });
    });
}

// 插入数据
async function insertUser(opt) {          // 接收到传来的数据执行函数内容
    return new Promise((resolve, reject) => {
        connection.query(`INSERT INTO userlist3 (username, password) VALUES (?, ?)`, [opt.username, opt.password], (err, result) => {
            if (err) {
                reject(1);          // 错误返回1
            } else {
                resolve(result);
            }
        })
    })
}

module.exports = {              // 抛出查询或添加后的数据
    find,
    insertUser
}

注册的路由文件

// post-注册-路由文件

const Router = require('koa-router');

const router = new Router();

const path = require('path');

const {find, insertUser} = require('../../../controller/db');  // 接收数据库传出的函数

router.post('/v1/post/register', async ctx => { 

    const {username, password} = ctx.request.body;

    let findRes = await find({username});  // 查找的方法

    if(findRes.length <= 0) {   // 返回一个数组,如果数组为空时
        let inser = await insertUser({username, password}); // 执行添加的函数
        console.log(inser)
        ctx.body = {
            status: 0,
            mag: '注册成功'
        }
    } else {
        ctx.body = {
            status: 1,
            mag: '用户已存在'
        }
    }
    
})

module.exports = router;

登录的路由文件


// POST-登录-路由

const Router = require('koa-router');

const router = new Router();

const {find} = require('../../../controller/db');

router.post('/v1/post/login', async ctx => {

    const {username, password} = ctx.request.body;

    let findRes = await find({username, password});

        if(findRes.length >= 1) {
            ctx.cookies.set('userid', findRes[0].id, {
                maxAge: 100 * 1000,
                expires: new Date('2020/8/5'),
                path: '/',
                domain: 'localhost'
            });

            ctx.body = {
                status: 0,
                mag: '登录成功',
                userid: findRes[0].id,
                redirect: '/personal'
            }
        } else {
            ctx.body = {
                status: 1,
                mag: '登录失败',
            }
        }

})


module.exports = router;

整个案例有四个页面,所以会成四篇简书分享给大家,有一些封装的代码是共用的,例如:ajax、自动获取路由等。
有哪里不清楚或写错的,希望大家留言告知!~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容

  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 5,197评论 2 54
  • 她说分手的时候我还沉浸在我们的热恋中 我不明白为什么,我很爱她,既然已经讲到这里了,我就顺带说一下我们的恋爱史:这...
    换不得阅读 148评论 1 2
  • 今天晚起,早上先生照顾小孩,我睡了一个懒觉,然后练完瑜伽大约十点钟,回到家里简单的吃了一点早餐。先生...
    岳Domke阅读 420评论 0 2