【15】大事件项目:附-大事件项目源码、大事件项目效果

文章目录

  • 大事件项目源码
    • article
      • `art_cate.html`
      • `art_list.html`
      • `art_pub.html`
    • assets
      • css
        • article
          • `art_cate.css`
          • `art_list.css`
          • `art_pub.css`
        • user
            • `user_avatar.css`
            • `user_info.css`
            • `user_pwd.css`
        • `index.css`
        • `login.css`
      • images
        • `login_bg.jpg`
      • `login_title.png`
      • `logo.png`
      • `sample.jpg`
      • `sample2.jpg`
      • js
        • article
          • `art_cate.js`
          • `art_list.js`
          • `art_pub.js`
        • user
          • `user_avatar.js`
          • `user_info.js`
          • `user_pwd.js`
        • `baseAPI.js`
        • `index.js`
        • `login.js`
    • home
      • `dashboard.html`
    • user
      • `user_avatar.html`
      • `user_info.html`
      • `user_pwd.html`
    • `index.html`
    • `login.html`
  • 大事件项目效果

大事件项目源码

【15】大事件项目:附-大事件项目源码、大事件项目效果_第1张图片


article

art_cate.html


<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    
    <link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
    
    <link rel="stylesheet" href="/assets/css/article/art_cate.css">
head>

<body>
    
    <div class="layui-card">
        <div class="layui-card-header">
            <span>文章类别管理span>
            <button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="btnAddCate">添加类别button>
        div>
        <div class="layui-card-body">
            <table class="layui-table">
                <colgroup>
                    <col />
                    <col />
                    <col width="200" />
                colgroup>
                <thead>
                    <tr>
                        <th>分类名称th>
                        <th>分类别名th>
                        <th>操作th>
                    tr>
                thead>
                <tbody>tbody>
            table>
        div>
    div>

    
    <script type="text/html" id="tpl-table">
        {
      {
      each data}}
        <tr>
            <td>{
      {
      $value.name}}</td>
            <td>{
      {
      $value.alias}}</td>
            <td>
                <button type="button" class="layui-btn layui-btn-xs btn-edit" data-id="{
      {$value.Id}}">编辑</button>
                <button type="button" class="layui-btn layui-btn-danger layui-btn-xs btn-delete" data-id="{
      {$value.Id}}">删除</button>
            </td>
        </tr>
        {
      {
      /each}}
    script>

    
    <script type="text/html" id="dialog-add">
        <form class="layui-form" id="form-add">
            <div class="layui-form-item">
                <label class="layui-form-label">分类名称</label>
                <div class="layui-input-block">
                    <input type="text" name="name" required lay-verify="required" placeholder="请输入分类名称"
                        autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">分类别名</label>
                <div class="layui-input-block">
                    <input type="text" name="alias" required lay-verify="required" placeholder="请输入分类别名"
                        autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <div class="layui-input-block">
                    <button class="layui-btn" lay-submit lay-filter="formDemo">确认添加</button>
                    <button type="reset" class="layui-btn layui-btn-primary">重置</button>
                </div>
            </div>
        </form>
    script>

        
        <script type="text/html" id="dialog-edit">
            <form class="layui-form" id="form-edit" lay-filter="form-edit">
                <input type="hidden" name="Id">
                <div class="layui-form-item">
                    <label class="layui-form-label">分类名称</label>
                    <div class="layui-input-block">
                        <input type="text" name="name" required lay-verify="required" placeholder="请输入分类名称"
                            autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">分类别名</label>
                    <div class="layui-input-block">
                        <input type="text" name="alias" required lay-verify="required" placeholder="请输入分类别名"
                            autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <div class="layui-input-block">
                        <button class="layui-btn" lay-submit lay-filter="formDemo">确认修改</button>
                    </div>
                </div>
            </form>
        script>

    
    <script src="/assets/lib/layui/layui.all.js">script>
    
    <script src="/assets/lib/jquery.js">script>
    
    <script src="/assets/js/baseAPI.js">script>
    
    <script src="/assets/lib/template-web.js">script>
    
    <script src="/assets/js/article/art_cate.js">script>
body>

html>

art_list.html


<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    
    <link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
    
    <link rel="stylesheet" href="/assets/css/article/art_list.css">
head>

<body>
    
    <div class="layui-card">
        <div class="layui-card-header">文章列表div>
        <div class="layui-card-body">
            
            <form class="layui-form" id="form-search">
                <div class="layui-form-item layui-inline">
                    <select name="cate_id">select>
                div>
                <div class="layui-form-item layui-inline">
                    <select name="state">
                        <option value="">所有状态option>
                        <option value="已发布">已发布option>
                        <option value="草稿">草稿option>
                    select>
                div>
                <div class="layui-form-item layui-inline">
                    <button class="layui-btn" lay-submit lay-filter="formDemo">筛选button>
                div>
            form>
            
            <table class="layui-table">
                <colgroup>
                    <col />
                    <col width="150" />
                    <col width="180" />
                    <col width="150" />
                    <col width="150" />
                colgroup>
                <thead>
                    <tr>
                        <th>文章标题th>
                        <th>分类th>
                        <th>发表时间th>
                        <th>状态th>
                        <th>操作th>
                    tr>
                thead>
                <tbody>tbody>
            table>
            
            <div id="pageBox">div>
        div>
    div>

    
    <script type="text/html" id="tpl-table">
        {
      {
      each data}}
        <tr>
            <td>{
      {
      $value.title}}</td>
            <td>{
      {
      $value.cate_name}}</td>
            <td>{
      {
      $value.pub_date|dataFormat}}</td>
            <td>{
      {
      $value.state}}</td>
            <td>
                <button type="button" class="layui-btn layui-btn-xs">编辑</button>
                <button type="button" class="layui-btn layui-btn-danger layui-btn-xs btn-delete"
                    data-id="{
      {$value.Id}}">删除</button>
            </td>
        </tr>
        {
      {
      /each}}
    script>

    
    <script type="text/html" id="tpl-cate">
        <option value="">所有分类</option>
        {
      {
      each data}}
        <option value="{
      {$value.Id}}">{
      {
      $value.name}}</option>
        {
      {
      /each}}
    script>

    
    <script src="/assets/lib/layui/layui.all.js">script>
    
    <script src="/assets/lib/jquery.js">script>
    
    <script src="/assets/js/baseAPI.js">script>
    
    <script src="/assets/lib/template-web.js">script>
    
    <script src="/assets/js/article/art_list.js">script>

body>

html>

art_pub.html


<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    
    <link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
    
    <link rel="stylesheet" href="/assets/lib/cropper/cropper.css" />
    
    <link rel="stylesheet" href="/assets/css/article/art_pub.css">

head>

<body>
    
    <div class="layui-card">
        <div class="layui-card-header">写文章div>
        <div class="layui-card-body">
            
            <form class="layui-form" id="form-pub">
                
                <div class="layui-form-item">
                    <label class="layui-form-label">文章标题label>
                    <div class="layui-input-block">
                        <input type="text" name="title" required lay-verify="required" placeholder="请输入标题"
                            autocomplete="off" class="layui-input" />
                    div>
                div>
                
                <div class="layui-form-item">
                    <label class="layui-form-label">文章类别label>
                    <div class="layui-input-block">
                        <select name="cate_id" lay-verify="required">select>
                    div>
                div>
                
                <div class="layui-form-item">
                    
                    <label class="layui-form-label">文章内容label>
                    
                    <div class="layui-input-block" style="height: 400px;">
                        
                        <textarea name="content">textarea>
                    div>
                div>
                
                <div class="layui-form-item">
                    
                    <label class="layui-form-label">文章封面label>
                    
                    <div class="layui-input-block cover-box">
                        
                        <div class="cover-left">
                            <img id="image" src="/assets/images/sample2.jpg" alt="" />
                        div>
                        
                        <div class="cover-right">
                            
                            <div class="img-preview">div>
                            
                            <button type="button" class="layui-btn layui-btn-danger" id="btnChooseImage">选择封面button>
                            
                            <input type="file" id="coverFile" style="display: none;"
                                accept="image/png,image/jpeg,image/gif" />
                        div>
                    div>
                div>
                
                <div class="layui-form-item">
                    <div class="layui-input-block">
                        <button class="layui-btn" lay-submit>发布button>
                        <button class="layui-btn layui-btn-primary" lay-submit id="btnSave2">存为草稿button>
                    div>
                div>
            form>
        div>
    div>

    <script type="text/html" id="tpl-cate">
        <option value="">请选择文章类别</option>
        {
      {
      each data}}
        <option value="{
      {$value.Id}}">{
      {
      $value.name}}</option>
        {
      {
      /each}}
    script>

    
    <script src="/assets/lib/layui/layui.all.js">script>
    
    <script src="/assets/lib/jquery.js">script>
    
    <script src="/assets/js/baseAPI.js">script>
    
    <script src="/assets/lib/template-web.js">script>
    
    <script src="/assets/lib/tinymce/tinymce.min.js">script>
    <script src="/assets/lib/tinymce/tinymce_setup.js">script>
    
    <script src="/assets/lib/cropper/Cropper.js">script>
    <script src="/assets/lib/cropper/jquery-cropper.js">script>
    
    <script src="/assets/js/article/art_pub.js">script>

body>

html>

assets

css

article

art_cate.css
html,
body {
     
    margin: 0;
    padding: 0;
}

body {
     
    padding: 15px;
    background-color: #f2f3f5;
}

.layui-card-header {
     
    display: flex;
    justify-content: space-between;
    align-items: center;
}

#form-add,
#form-edit {
     
    padding-top: 20px;
    padding-right: 30px;
}
art_list.css
html,
body {
     
    margin: 0;
    padding: 0;
}

body {
     
    padding: 15px;
    background-color: #f2f3f5;
}
art_pub.css
html,
body {
     
    margin: 0;
    padding: 0;
}

body {
     
    padding: 15px;
    background-color: #f2f3f5;
}

/* 封面容器的样式 */
.cover-box {
     
    display: flex;
}

/* 左侧裁剪区域的样式 */
.cover-left {
     
    width: 400px;
    height: 280px;
    overflow: hidden;
    margin-right: 20px;
}

/* 右侧盒子的样式 */
.cover-right {
     
    display: flex;
    flex-direction: column;
    align-items: center;
}

/* 预览区域的样式 */
.img-preview {
     
    width: 200px;
    height: 140px;
    background-color: #ccc;
    margin-bottom: 20px;
    overflow: hidden;
}

user

user_avatar.css
html,
body {
     
    margin: 0;
    padding: 0;
}

body {
     
    padding: 15px;
    background-color: #f2f3f5;
}

/* 设置卡片主体区域的宽度 */
.layui-card-body {
     
    width: 500px;
}

/* 设置按钮行的样式 */
.row2 {
     
    display: flex;
    justify-content: flex-end;
    margin-top: 20px;
}

/* 设置裁剪区域的样式 */
.cropper-box {
     
    width: 350px;
    height: 350px;
    background-color: cyan;
    overflow: hidden;
}

/* 设置第一个预览区域的样式 */
.w100 {
     
    width: 100px;
    height: 100px;
    background-color: gray;
}

/* 设置第二个预览区域的样式 */
.w50 {
     
    width: 50px;
    height: 50px;
    background-color: gray;
    margin-top: 50px;
}

/* 设置预览区域下方文本的样式 */
.size {
     
    font-size: 12px;
    color: gray;
    text-align: center;
}

/* 设置图片行的样式 */
.row1 {
     
    display: flex;
}

/* 设置 preview-box 区域的的样式 */
.preview-box {
     
    display: flex;
    flex-direction: column;
    flex: 1;
    align-items: center;
}

/* 设置 img-preview 区域的样式 */
.img-preview {
     
    overflow: hidden;
    border-radius: 50%;
}

#file {
     
    display: none;
}
user_info.css
html,
body {
     
    margin: 0;
    padding: 0;
}

body {
     
    background-color: #f2f3f5;
    padding: 15px;
}

.layui-form {
     
    width: 500px;
}
user_pwd.css
html,
body {
     
    margin: 0;
    padding: 0;
}

body {
     
    padding: 15px;
    background-color: #f2f3f5;
}

.layui-form {
     
    width: 500px;
}

index.css

.layui-footer {
     
    text-align: center;
    font-size: 12px;
}

.iconfont {
     
    margin-right: 8px;
}

.layui-icon {
     
    margin-right: 8px;
    margin-left: 20px;
}

iframe {
     
    width: 100%;
    height: 100%;
}

.layui-body {
     
    overflow: hidden;
}

a {
     
    transition: none !important;
}

.userInfo {
     
    height: 60px;
    line-height: 60px;
    text-align: center;
    font-size: 12px;
    user-select: none;
}

.layui-side-scroll .userInfo {
     
    border-bottom: 1px solid #282b33;
}

.layui-nav-img {
     
    width: 40px;
    height: 40px;
}

.text-avatar {
     
    display: inline-block;
    width: 40px;
    height: 40px;
    background-color: #009688;
    border-radius: 50%;
    line-height: 40px;
    text-align: center;
    font-size: 20px;
    color: #ffffff;
    position: relative;
    top: 4px;
    margin-right: 10px;
}

login.css

html,
body {
     
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
    background: url('/assets/images/login_bg.jpg') no-repeat center;
    background-size: cover;
}

.loginAndRegBox {
     
    width: 400px;
    height: 310px;
    background-color: #fff;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}

.title-box {
     
    height: 60px;
    background: url('/assets/images/login_title.png') no-repeat center;
}

.reg-box {
     
    display: none;
}

.layui-form {
     
    padding: 0px 30px;
}

.links {
     
    display: flex;
    justify-content: flex-end;
}

.links a {
     
    font-size: 12px;
}

.layui-form-item {
     
    position: relative;
}

.layui-icon {
     
    position: absolute;
    left: 10px;
    top: 10px;
}

.layui-input {
     
    padding-left: 32px;
}

images

login_bg.jpg

【15】大事件项目:附-大事件项目源码、大事件项目效果_第2张图片

login_title.png

在这里插入图片描述

logo.png

在这里插入图片描述

sample.jpg

【15】大事件项目:附-大事件项目源码、大事件项目效果_第3张图片

sample2.jpg

【15】大事件项目:附-大事件项目源码、大事件项目效果_第4张图片

js

article

art_cate.js
$(function () {
     
    var layer = layui.layer
    var form = layui.form

    initArtCateList()

    // 获取文章分类的列表
    function initArtCateList() {
     
        $.ajax({
     
            method: 'GET',
            url: '/my/article/cates',
            success: function (res) {
     
                var htmlStr = template('tpl-table', res)
                $('tbody').html(htmlStr)
            }
        })
    }

    // 为添加类别按钮绑定点击事件
    var indexAdd = null
    $('#btnAddCate').on('click', function () {
     
        indexAdd = layer.open({
     
            type: 1,
            area: ['500px', '250px'],
            title: '添加文章分类',
            content: $('#dialog-add').html()
        })
    })

    // 通过代理的形式,为 form-add 表单绑定 submit 事件
    $('body').on('submit', '#form-add', function (e) {
     
        e.preventDefault()
        $.ajax({
     
            method: 'POST',
            url: '/my/article/addcates',
            data: $(this).serialize(),
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('新增分类失败!')
                }
                initArtCateList()
                layer.msg('新增分类成功!')
                // 根据索引,关闭对应的弹出层
                layer.close(indexAdd)
            }
        })
    })

    // 通过代理的形式,为 btn-edit 按钮绑定点击事件
    var indexEdit = null
    $('tbody').on('click', '.btn-edit', function () {
     
        // 弹出一个修改文章分类信息的层
        indexEdit = layer.open({
     
            type: 1,
            area: ['500px', '250px'],
            title: '修改文章分类',
            content: $('#dialog-edit').html()
        })

        var id = $(this).attr('data-id')
        // 发起请求获取对应分类的数据
        $.ajax({
     
            method: 'GET',
            url: '/my/article/cates/' + id,
            success: function (res) {
     
                form.val('form-edit', res.data)
            }
        })
    })

    // 通过代理的形式,为修改分类的表单绑定 submit 事件
    $('body').on('submit', '#form-edit', function (e) {
     
        e.preventDefault()
        $.ajax({
     
            method: 'POST',
            url: '/my/article/updatecate',
            data: $(this).serialize(),
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('更新分类数据失败!')
                }
                layer.msg('更新分类数据成功!')
                layer.close(indexEdit)
                initArtCateList()
            }
        })
    })

    // 通过代理的形式,为删除按钮绑定点击事件
    $('tbody').on('click', '.btn-delete', function () {
     
        var id = $(this).attr('data-id')
        // 提示用户是否要删除
        layer.confirm('确认删除?', {
     
            icon: 3,
            title: '提示'
        }, function (index) {
     
            $.ajax({
     
                method: 'GET',
                url: '/my/article/deletecate/' + id,
                success: function (res) {
     
                    if (res.status !== 0) {
     
                        return layer.msg('删除分类失败!')
                    }
                    layer.msg('删除分类成功!')
                    layer.close(index)
                    initArtCateList()
                }
            })
        })
    })
})
art_list.js
$(function () {
     
    var layer = layui.layer;
    var form = layui.form;
    var laypage = layui.laypage;

    // 定义美化时间的过滤器
    template.defaults.imports.dataFormat = function (date) {
     
        const dt = new Date(date)

        var y = dt.getFullYear()
        var m = padZero(dt.getMonth() + 1)
        var d = padZero(dt.getDate())

        var hh = padZero(dt.getHours())
        var mm = padZero(dt.getMinutes())
        var ss = padZero(dt.getSeconds())

        return y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss
    }

    // 定义补零的函数
    function padZero(n) {
     
        return n > 9 ? n : '0' + n
    }

    // 定义一个查询的参数对象,将来请求数据的时候,
    // 需要将请求参数对象提交到服务器
    var q = {
     
        pagenum: 1, // 页码值,默认请求第一页的数据
        pagesize: 2, // 每页显示几条数据,默认每页显示2条
        cate_id: '', // 文章分类的 Id
        state: '' // 文章的发布状态
    }

    initTable()
    initCate()

    // 获取文章列表数据的方法
    function initTable() {
     
        $.ajax({
     
            method: 'GET',
            url: '/my/article/list',
            data: q,
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('获取文章列表失败!')
                }
                // 使用模板引擎渲染页面的数据
                var htmlStr = template('tpl-table', res)
                $('tbody').html(htmlStr)
                // 调用渲染分页的方法
                renderPage(res.total)
            }
        })
    }

    // 初始化文章分类的方法
    function initCate() {
     
        $.ajax({
     
            method: 'GET',
            url: '/my/article/cates',
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('获取分类数据失败!')
                }
                // 调用模板引擎渲染分类的可选项
                var htmlStr = template('tpl-cate', res)
                $('[name=cate_id]').html(htmlStr)
                // 通过 layui 重新渲染表单区域的UI结构
                form.render()
            }
        })
    }

    // 为筛选表单绑定 submit 事件
    $('#form-search').on('submit', function (e) {
     
        e.preventDefault()
        // 获取表单中选中项的值
        var cate_id = $('[name=cate_id]').val()
        var state = $('[name=state]').val()
        // 为查询参数对象 q 中对应的属性赋值
        q.cate_id = cate_id
        q.state = state
        // 根据最新的筛选条件,重新渲染表格的数据
        initTable()
    })

    // 定义渲染分页的方法
    function renderPage(total) {
     
        // 调用 laypage.render() 方法来渲染分页的结构
        laypage.render({
     
            elem: 'pageBox', // 分页容器的 Id
            count: total, // 总数据条数
            limit: q.pagesize, // 每页显示几条数据
            curr: q.pagenum, // 设置默认被选中的分页
            layout: ['count', 'limit', 'prev', 'page', 'next', 'skip'],
            limits: [2, 3, 5, 10],
            // 分页发生切换的时候,触发 jump 回调
            // 触发 jump 回调的方式有两种:
            // 1. 点击页码的时候,会触发 jump 回调
            // 2. 只要调用了 laypage.render() 方法,就会触发 jump 回调
            jump: function (obj, first) {
     
                // 可以通过 first 的值,来判断是通过哪种方式,触发的 jump 回调
                // 如果 first 的值为 true,证明是方式2触发的
                // 否则就是方式1触发的
                console.log(first)
                console.log(obj.curr)
                // 把最新的页码值,赋值到 q 这个查询参数对象中
                q.pagenum = obj.curr
                // 把最新的条目数,赋值到 q 这个查询参数对象的 pagesize 属性中
                q.pagesize = obj.limit
                // 根据最新的 q 获取对应的数据列表,并渲染表格
                // initTable()
                if (!first) {
     
                    initTable()
                }
            }
        })
    }

    // 通过代理的形式,为删除按钮绑定点击事件处理函数
    $('tbody').on('click', '.btn-delete', function () {
     
        // 获取删除按钮的个数
        var len = $('.btn-delete').length
        // 获取到文章的 id
        var id = $(this).attr('data-id')
        // 询问用户是否要删除数据
        layer.confirm('确认删除?', {
     
            icon: 3,
            title: '提示'
        }, function (index) {
     
            $.ajax({
     
                method: 'GET',
                url: '/my/article/delete/' + id,
                success: function (res) {
     
                    if (res.status !== 0) {
     
                        return layer.msg('删除文章失败!')
                    }
                    layer.msg('删除文章成功!')
                    // 当数据删除完成后,需要判断当前这一页中,是否还有剩余的数据
                    // 如果没有剩余的数据了,则让页码值 -1 之后,
                    // 再重新调用 initTable 方法
                    // 4
                    if (len === 1) {
     
                        // 如果 len 的值等于1,证明删除完毕之后,页面上就没有任何数据了
                        // 页码值最小必须是 1
                        q.pagenum = q.pagenum === 1 ? 1 : q.pagenum - 1
                    }
                    initTable()
                }
            })

            layer.close(index)
        })
    })
})
art_pub.js
$(function () {
     
    var layer = layui.layer
    var form = layui.form

    initCate()
    // 初始化富文本编辑器
    initEditor()

    // 定义加载文章分类的方法
    function initCate() {
     
        $.ajax({
     
            method: 'GET',
            url: '/my/article/cates',
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('初始化文章分类失败!')
                }
                // 调用模板引擎,渲染分类的下拉菜单
                var htmlStr = template('tpl-cate', res)
                $('[name=cate_id]').html(htmlStr)
                // 一定要记得调用 form.render() 方法
                form.render()
            }
        })
    }

    // 1. 初始化图片裁剪器
    var $image = $('#image')

    // 2. 裁剪选项
    var options = {
     
        aspectRatio: 400 / 280,
        preview: '.img-preview'
    }

    // 3. 初始化裁剪区域
    $image.cropper(options)

    // 为选择封面的按钮,绑定点击事件处理函数
    $('#btnChooseImage').on('click', function () {
     
        $('#coverFile').click()
    })

    // 监听 coverFile 的 change 事件,获取用户选择的文件列表
    $('#coverFile').on('change', function (e) {
     
        // 获取到文件的列表数组
        var files = e.target.files
        // 判断用户是否选择了文件
        if (files.length === 0) {
     
            return
        }
        // 根据文件,创建对应的 URL 地址
        var newImgURL = URL.createObjectURL(files[0])
        // 为裁剪区域重新设置图片
        $image
            .cropper('destroy') // 销毁旧的裁剪区域
            .attr('src', newImgURL) // 重新设置图片路径
            .cropper(options) // 重新初始化裁剪区域
    })

    // 定义文章的发布状态
    var art_state = '已发布'

    // 为存为草稿按钮,绑定点击事件处理函数
    $('#btnSave2').on('click', function () {
     
        art_state = '草稿'
    })

    // 为表单绑定 submit 提交事件
    $('#form-pub').on('submit', function (e) {
     
        // 1. 阻止表单的默认提交行为
        e.preventDefault()
        // 2. 基于 form 表单,快速创建一个 FormData 对象
        var fd = new FormData($(this)[0]) //通过 $(this)[0] 的方式将 jQuery 对象转换为原生的对象
        // 3. 将文章的发布状态,存到 fd 中
        fd.append('state', art_state)
        // 4. 将封面裁剪过后的图片,输出为一个文件对象
        $image
            .cropper('getCroppedCanvas', {
     
                // 创建一个 Canvas 画布
                width: 400,
                height: 280
            })
            .toBlob(function (blob) {
     
                // 将 Canvas 画布上的内容,转化为文件对象
                // 得到文件对象后,进行后续的操作
                // 5. 将文件对象,存储到 fd 中
                fd.append('cover_img', blob)
                // 6. 发起 ajax 数据请求
                publishArticle(fd)
            })
    })

    // 定义一个发布文章的方法
    function publishArticle(fd) {
     
        $.ajax({
     
            method: 'POST',
            url: '/my/article/add',
            data: fd,
            // 注意:如果向服务器提交的是 FormData 格式的数据,
            // 必须添加以下两个配置项
            contentType: false,
            processData: false,
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('发布文章失败!')
                }
                layer.msg('发布文章成功!')
                // 发布文章成功后,跳转到文章列表页面
                location.href = '/article/art_list.html'
            }
        })
    }
})

user

user_avatar.js
$(function () {
     
    var layer = layui.layer;

    // 1.1 获取裁剪区域的 DOM 元素
    var $image = $('#image');
    // 1.2 配置选项
    const options = {
     
        // 纵横比
        aspectRatio: 1,
        // 指定预览区域
        preview: '.img-preview'
    }

    // 1.3 创建裁剪区域
    $image.cropper(options);

    // 为上传按钮绑定点击事件
    $('#btnChooseImage').on('click', function () {
     
        $('#file').click();
    })

    // 为文件选择框绑定 change 事件
    $('#file').on('change', function (e) {
     
        // 获取用户选择的文件
        var filelist = e.target.files;
        if (filelist.length === 0) {
     
            return layer.msg('请选择照片!');
        }

        // 1. 拿到用户选择的文件
        var file = e.target.files[0];
        // 2. 将文件,转化为路径
        var imgURL = URL.createObjectURL(file);
        // 3. 重新初始化裁剪区域
        $image
            .cropper('destroy') // 销毁旧的裁剪区域
            .attr('src', imgURL) // 重新设置图片路径
            .cropper(options) // 重新初始化裁剪区域
    })

    // 为确定按钮,绑定点击事件
    $('#btnUpload').on('click', function () {
     
        // 1. 要拿到用户裁剪之后的头像
        var dataURL = $image
            .cropper('getCroppedCanvas', {
     
                // 创建一个 Canvas 画布
                width: 100,
                height: 100
            })
            .toDataURL('image/png') // 将 Canvas 画布上的内容,转化为 base64 格式的字符串
        // 2. 调用接口,把头像上传到服务器
        $.ajax({
     
            method: 'POST',
            url: '/my/update/avatar',
            data: {
     
                avatar: dataURL
            },
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('更换头像失败!');
                }
                layer.msg('更换头像成功!');
                window.parent.getUserInfo();
            }
        })
    })
})
user_info.js
$(function () {
     
    var form = layui.form;
    var layer = layui.layer;

    form.verify({
     
        nickname: function (value) {
     
            if (value.length > 6) {
     
                return '昵称长度必须在 1 ~ 6 个字符之间!'
            }
        }
    })

    initUserInfo();

    // 初始化用户的基本信息
    function initUserInfo() {
     
        $.ajax({
     
            method: 'GET',
            url: '/my/userinfo',
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('获取用户信息失败!');
                }
                console.log(res);
                // 调用 form.val() 快速为表单赋值
                form.val('formUserInfo', res.data);
            }
        })
    }

    // 重置表单的数据
    $('#btbReset').on('click', function (e) {
     
        // 阻止表单的默认重置行为
        e.preventDefault();
        initUserInfo();
    })

    // 监听表单的提交事件
    $('.layui-form').on('submit', function (e) {
     
        // 阻止表单的默认提交行为
        e.preventDefault();
        // 发起 ajax 数据请求
        $.ajax({
     
            method: 'POST',
            url: '/my/userinfo',
            data: $(this).serialize(),
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('更新用户信息失败!');
                }
                layer.msg('更新用户信息成功!');
                // 调用父页面中的方法,重新渲染用户的头像和用户的信息
                window.parent.getUserInfo();
            }
        })
    })
})
user_pwd.js
$(function () {
     
    var form = layui.form

    form.verify({
     
        pwd: [/^[\S]{6,12}$/, '密码必须6到12位,且不能出现空格'],
        samePwd: function (value) {
     
            if (value === $('[name=oldPwd]').val()) {
     
                return '新旧密码不能相同!'
            }
        },
        rePwd: function (value) {
     
            if (value !== $('[name=newPwd]').val()) {
     
                return '两次密码不一致!'
            }
        }
    })

    $('.layui-form').on('submit', function (e) {
     
        e.preventDefault()
        $.ajax({
     
            method: 'POST',
            url: '/my/updatepwd',
            data: $(this).serialize(),
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layui.layer.msg('更新密码失败!');
                }
                layui.layer.msg('更新密码成功!');
                // 重置表单
                $('.layui-form')[0].reset();
            }
        })
    })
})

baseAPI.js

// 注意:每次调用 $.get() 或 $.post() 或 $.ajax() 的时候,
// 会先调用 ajaxPrefilter 这个函数
// 在这个函数中,可以拿到我们给Ajax提供的配置对象
$.ajaxPrefilter(function (options) {
     
  // 在发起真正的 Ajax 请求之前,统一拼接请求的根路径
  options.url = 'http://ajax.frontend.itheima.net' + options.url;

  // 统一为有权限的接口,设置 headers 请求头
  if (options.url.indexOf('/my') !== -1) {
     
    options.headers = {
     
      Authorization: localStorage.getItem('token') || '',
    }
  }

  // 全局挂载 complete 回调函数
  options.complete = function (res) {
     
    // console.log('执行了 complete 回调:');
    // console.log('res');
    // 在 complete 回调函数中,可以使用 res.responseJSON 拿到服务器响应回来的数据
    if (res.responseJSON.status === 1 && res.responseJSON.message === '身份认证失败!') {
     
      // 1. 强制清空 token
      localStorage.removeItem('token');
      // 2. 强制跳转到登录页面
      location.href = '/login.html';
    }
  }
});

index.js

$(function () {
     
    // 调用 getUserInfo 获取用户基本信息
    getUserInfo()

    var layer = layui.layer

    // 点击按钮,实现退出功能
    $('#btnLogout').on('click', function () {
     
        // 提示用户是否确认退出
        layer.confirm('确定退出登录?', {
     
            icon: 3,
            title: '提示'
        }, function (index) {
     
            //do something
            // 1. 清空本地存储中的 token
            localStorage.removeItem('token')
            // 2. 重新跳转到登录页面
            location.href = '/login.html'

            // 关闭 confirm 询问框
            layer.close(index)
        })
    })
})

// 获取用户的基本信息
function getUserInfo() {
     
    $.ajax({
     
        method: 'GET',
        url: '/my/userinfo',
        success: function (res) {
     
            if (res.status !== 0) {
     
                return layui.layer.msg('获取用户信息失败!')
            }
            // 调用 renderAvatar 渲染用户的头像
            renderAvatar(res.data)
        }
        // 不论成功还是失败,最终都会调用 complete 回调函数
        // complete: function(res) {
     
        //   // console.log('执行了 complete 回调:')
        //   // console.log(res)
        //   // 在 complete 回调函数中,可以使用 res.responseJSON 拿到服务器响应回来的数据
        //   if (res.responseJSON.status === 1 && res.responseJSON.message === '身份认证失败!') {
     
        //     // 1. 强制清空 token
        //     localStorage.removeItem('token')
        //     // 2. 强制跳转到登录页面
        //     location.href = '/login.html'
        //   }
        // }
    })
}

// 渲染用户的头像
function renderAvatar(user) {
     
    // 1. 获取用户的名称
    var name = user.nickname || user.username
    // 2. 设置欢迎的文本
    $('#welcome').html('欢迎  ' + name)
    // 3. 按需渲染用户的头像
    if (user.user_pic !== null) {
     
        // 3.1 渲染图片头像
        $('.layui-nav-img')
            .attr('src', user.user_pic)
            .show()
        $('.text-avatar').hide()
    } else {
     
        // 3.2 渲染文本头像
        $('.layui-nav-img').hide()
        var first = name[0].toUpperCase()
        $('.text-avatar')
            .html(first)
            .show()
    }
}

login.js

$(function () {
     
    // 点击“去注册账号”的链接
    $('#link_reg').on('click', function () {
     
        $('.login-box').hide();
        $('.reg-box').show();
    });

    // 点击“去登录”的链接
    $('#link_login').on('click', function () {
     
        $('.login-box').show();
        $('.reg-box').hide();
    });

    // 从 layui 中获取 form 对象
    var form = layui.form;
    var layer = layui.layer;
    // 通过 form.verify() 函数自定义校验规则
    form.verify({
     
        // 自定义了一个叫做 pwd 校验规则
        pwd: [/^[\S]{6,12}$/, '密码必须6到12位,且不能出现空格'],
        // 校验两次密码是否一致的规则
        repwd: function (value) {
     
            // 通过形参拿到的是确认密码框中的内容
            // 还需要拿到密码框中的内容
            // 然后进行一次等于的判断
            // 如果判断失败,则return一个提示消息即可
            // $('.reg-box [name=password]') 属性选择器
            var pwd = $('.reg-box [name=password]').val();
            if (pwd !== value) {
     
                return '两次密码不一致!';
            };
        }
    });

    // 监听注册表单的提交事件
    $('#form_reg').on('submit', function (e) {
     
        // 1. 阻止默认的提交行为
        e.preventDefault();
        // 2. 发起Ajax的POST请求
        var data = {
     
            username: $('#form_reg [name=username]').val(),
            password: $('#form_reg [name=password]').val()
        };
        $.post('/api/reguser', data, function (res) {
     
            if (res.status !== 0) {
     
                return layer.msg(res.message);
            };
            layer.msg('注册成功,请登录!');
            // 模拟人的点击行为
            $('#link_login').click();
        });
    });

    // 监听登录表单的提交事件
    $('#form_login').submit(function (e) {
     
        // 阻止默认提交行为
        e.preventDefault()
        $.ajax({
     
            url: '/api/login',
            method: 'POST',
            // 快速获取表单中的数据
            data: $(this).serialize(),
            success: function (res) {
     
                if (res.status !== 0) {
     
                    return layer.msg('登录失败!')
                }
                layer.msg('登录成功!')
                // 将登录成功得到的 token 字符串,保存到 localStorage 中
                localStorage.setItem('token', res.token)
                // 跳转到后台主页
                location.href = '/index.html'
            }
        })
    })
})

home

dashboard.html


<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>图表统计title>
  <link rel="stylesheet" href="/assets/lib/bootstrap.css" />
  <link rel="stylesheet" href="/assets/lib/main.css" />
  <script src="/assets/lib/jquery.js">script>
  <script type="text/javascript" src="/assets/lib/echarts.min.js">script>
head>

<body>
  <div class="container-fluid">
    <div class="row spannel_list">
      <div class="col-sm-3 col-xs-6">
        <div class="spannel">
          <em>10015em><span>span>
          <b>总文章数b>
        div>
      div>
      <div class="col-sm-3 col-xs-6">
        <div class="spannel scolor01">
          <em>123em><span>span>
          <b>日新增文章数b>
        div>
      div>
      <div class="col-sm-3 col-xs-6">
        <div class="spannel scolor02">
          <em>35em><span>span>
          <b>评论总数b>
        div>
      div>
      <div class="col-sm-3 col-xs-6">
        <div class="spannel scolor03">
          <em>123em><span>span>
          <b>日新增评论数b>
        div>
      div>
    div>
  div>

  <div class="container-fluid">
    <div class="row curve-pie">
      <div class="col-lg-8 col-md-8">
        <div class="gragh_pannel" id="curve_show">div>
      div>
      <div class="col-lg-4 col-md-4">
        <div class="gragh_pannel" id="pie_show">div>
      div>
    div>
  div>

  <div class="container-fluid">
    <div class="column_pannel" id="column_show">div>
  div>

  <script>
    var oChart = echarts.init(document.getElementById('curve_show'));
    var aList_all = [
      {
       'count': 36, 'date': '2019-04-13' },
      {
       'count': 52, 'date': '2019-04-14' },
      {
       'count': 78, 'date': '2019-04-15' },
      {
       'count': 85, 'date': '2019-04-16' },
      {
       'count': 65, 'date': '2019-04-17' },
      {
       'count': 72, 'date': '2019-04-18' },
      {
       'count': 88, 'date': '2019-04-19' },
      {
       'count': 64, 'date': '2019-04-20' },
      {
       'count': 72, 'date': '2019-04-21' },
      {
       'count': 90, 'date': '2019-04-22' },
      {
       'count': 96, 'date': '2019-04-23' },
      {
       'count': 100, 'date': '2019-04-24' },
      {
       'count': 102, 'date': '2019-04-25' },
      {
       'count': 110, 'date': '2019-04-26' },
      {
       'count': 123, 'date': '2019-04-27' },
      {
       'count': 100, 'date': '2019-04-28' },
      {
       'count': 132, 'date': '2019-04-29' },
      {
       'count': 146, 'date': '2019-04-30' },
      {
       'count': 200, 'date': '2019-05-01' },
      {
       'count': 180, 'date': '2019-05-02' },
      {
       'count': 163, 'date': '2019-05-03' },
      {
       'count': 110, 'date': '2019-05-04' },
      {
       'count': 80, 'date': '2019-05-05' },
      {
       'count': 82, 'date': '2019-05-06' },
      {
       'count': 70, 'date': '2019-05-07' },
      {
       'count': 65, 'date': '2019-05-08' },
      {
       'count': 54, 'date': '2019-05-09' },
      {
       'count': 40, 'date': '2019-05-10' },
      {
       'count': 45, 'date': '2019-05-11' },
      {
       'count': 38, 'date': '2019-05-12' },
    ];

    let aCount = [];
    let aDate = [];

    for (var i = 0; i < aList_all.length; i++) {
      
      aCount.push(aList_all[i].count);
      aDate.push(aList_all[i].date);
    }

    var chartopt = {
      
      title: {
      
        text: '月新增文章数',
        left: 'center',
        top: '10'
      },
      tooltip: {
      
        trigger: 'axis'
      },
      legend: {
      
        data: ['新增文章'],
        top: '40'
      },
      toolbox: {
      
        show: true,
        feature: {
      
          mark: {
       show: true },
          dataView: {
       show: true, readOnly: false },
          magicType: {
       show: true, type: ['line', 'bar'] },
          restore: {
       show: true },
          saveAsImage: {
       show: true }
        }
      },
      calculable: true,
      xAxis: [
        {
      
          name: '日',
          type: 'category',
          boundaryGap: false,
          data: aDate
        }
      ],
      yAxis: [
        {
      
          name: '月新增文章数',
          type: 'value'
        }
      ],
      series: [
        {
      
          name: '新增文章',
          type: 'line',
          smooth: true,
          itemStyle: {
       normal: {
       areaStyle: {
       type: 'default' }, color: '#f80' }, lineStyle: {
       color: '#f80' } },
          data: aCount
        }],
      areaStyle: {
      
        normal: {
      
          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
      
            offset: 0,
            color: 'rgba(255,136,0,0.39)'
          }, {
      
            offset: .34,
            color: 'rgba(255,180,0,0.25)'
          }, {
      
            offset: 1,
            color: 'rgba(255,222,0,0.00)'
          }])

        }
      },
      grid: {
      
        show: true,
        x: 50,
        x2: 50,
        y: 80,
        height: 220
      }
    };

    oChart.setOption(chartopt);


    var oPie = echarts.init(document.getElementById('pie_show'));
    var oPieopt =
    {
      
      title: {
      
        top: 10,
        text: '分类文章数量比',
        x: 'center'
      },
      tooltip: {
      
        trigger: 'item',
        formatter: "{a} 
{b} : {c} ({d}%)"
}, color: ['#5885e8', '#13cfd5', '#00ce68', '#ff9565'], legend: { x: 'center', top: 65, data: ['奇趣事', '会生活', '爱旅行', '趣美味'] }, toolbox: { show: true, x: 'center', top: 35, feature: { mark: { show: true }, dataView: { show: true, readOnly: false }, magicType: { show: true, type: ['pie', 'funnel'], option: { funnel: { x: '25%', width: '50%', funnelAlign: 'left', max: 1548 } } }, restore: { show: true }, saveAsImage: { show: true } } }, calculable: true, series: [ { name: '访问来源', type: 'pie', radius: ['45%', '60%'], center: ['50%', '65%'], data: [ { value: 300, name: '奇趣事' }, { value: 100, name: '会生活' }, { value: 260, name: '爱旅行' }, { value: 180, name: '趣美味' } ] } ] }; oPie.setOption(oPieopt); var oColumn = this.echarts.init(document.getElementById('column_show')); var oColumnopt = { title: { text: '文章访问量', left: 'center', top: '10' }, tooltip: { trigger: 'axis' }, legend: { data: ['奇趣事', '会生活', '爱旅行', '趣美味'], top: '40' }, toolbox: { show: true, feature: { mark: { show: true }, dataView: { show: true, readOnly: false }, magicType: { show: true, type: ['line', 'bar'] }, restore: { show: true }, saveAsImage: { show: true } } }, calculable: true, xAxis: [ { type: 'category', data: ['1月', '2月', '3月', '4月', '5月'] } ], yAxis: [ { name: '访问量', type: 'value' } ], series: [ { name: '奇趣事', type: 'bar', barWidth: 20, itemStyle: { normal: { areaStyle: { type: 'default' }, color: '#fd956a' } }, data: [800, 708, 920, 1090, 1200] }, { name: '会生活', type: 'bar', barWidth: 20, itemStyle: { normal: { areaStyle: { type: 'default' }, color: '#2bb6db' } }, data: [400, 468, 520, 690, 800] }, { name: '爱旅行', type: 'bar', barWidth: 20, itemStyle: { normal: { areaStyle: { type: 'default' }, color: '#13cfd5' } }, data: [500, 668, 520, 790, 900] }, { name: '趣美味', type: 'bar', barWidth: 20, itemStyle: { normal: { areaStyle: { type: 'default' }, color: '#00ce68' } }, data: [600, 508, 720, 890, 1000] } ], grid: { show: true, x: 50, x2: 30, y: 80, height: 260 }, dataZoom: [//给x轴设置滚动条 { start: 0,//默认为0 end: 100 - 1000 / 31,//默认为100 type: 'slider', show: true, xAxisIndex: [0], handleSize: 0,//滑动条的 左右2个滑动条的大小 height: 8,//组件高度 left: 45, //左边的距离 right: 50,//右边的距离 bottom: 26,//右边的距离 handleColor: '#ddd',//h滑动图标的颜色 handleStyle: { borderColor: "#cacaca", borderWidth: "1", shadowBlur: 2, background: "#ddd", shadowColor: "#ddd", } }] }; oColumn.setOption(oColumnopt);
script> body> html>

user

user_avatar.html


<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    
    <link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
    
    <link rel="stylesheet" href="/assets/lib/cropper/cropper.css" />
    
    <link rel="stylesheet" href="/assets/css/user/user_avatar.css">
head>

<body>
    
    <div class="layui-card">
        <div class="layui-card-header">更换头像div>
        <div class="layui-card-body">
            
            <div class="row1">
                
                <div class="cropper-box">
                    
                    <img id="image" src="/assets/images/sample.jpg" />
                div>
                
                <div class="preview-box">
                    <div>
                        
                        <div class="img-preview w100">div>
                        <p class="size">100 x 100p>
                    div>
                    <div>
                        
                        <div class="img-preview w50">div>
                        <p class="size">50 x 50p>
                    div>
                div>
            div>

            
            <div class="row2">
                
                <input type="file" id="file" accept="image/png,image/jpeg">
                <button type="button" class="layui-btn" id="btnChooseImage">上传button>
                <button type="button" class="layui-btn layui-btn-danger" id="btnUpload">确定button>
            div>
        div>
    div>
    
    <script src="/assets/lib/layui/layui.all.js">script>
    
    <script src="/assets/lib/jquery.js">script>
    
    <script src="/assets/lib/cropper/Cropper.js">script>
    <script src="/assets/lib/cropper/jquery-cropper.js">script>
    
    <script src="/assets/js/baseAPI.js">script>
    
    <script src="/assets/js/user/user_avatar.js">script>
body>

html>

user_info.html


<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    
    <link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
    
    <link rel="stylesheet" href="/assets/css/user/user_info.css">
head>

<body>
    
    <div class="layui-card">
        <div class="layui-card-header">修改用户信息div>
        <div class="layui-card-body">
            
            <form class="layui-form" lay-filter="formUserInfo">
                
                <input type="hidden" class="id" value="">
                <div class="layui-form-item">
                    <label class="layui-form-label">登录名称label>
                    <div class="layui-input-block">
                        <input type="text" name="username" required lay-verify="required" placeholder="请输入登录名称"
                            autocomplete="off" class="layui-input" readonly />
                    div>
                div>
                <div class="layui-form-item">
                    <label class="layui-form-label">用户昵称label>
                    <div class="layui-input-block">
                        <input type="text" name="nickname" required lay-verify="required|nickname" placeholder="请输入用户昵称"
                            autocomplete="off" class="layui-input" />
                    div>
                div>
                <div class="layui-form-item">
                    <label class="layui-form-label">用户邮箱label>
                    <div class="layui-input-block">
                        <input type="text" name="email" required lay-verify="required|email" placeholder="请输入用户邮箱"
                            autocomplete="off" class="layui-input" />
                    div>
                div>
                <div class="layui-form-item">
                    <div class="layui-input-block">
                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交修改button>
                        <button type="reset" class="layui-btn layui-btn-primary" id="btbReset">重置button>
                    div>
                div>
            form>
            
        div>
    div>

    
    <script src="/assets/lib/layui/layui.all.js">script>
    
    <script src="/assets/lib/jquery.js">script>
    
    <script src="/assets/js/baseAPI.js">script>
    
    <script src="/assets/js/user/user_info.js">script>
body>

html>

user_pwd.html


<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    
    <link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
    
    <link rel="stylesheet" href="/assets/css/user/user_info.css">
head>

<body>
    
    <div class="layui-card">
        <div class="layui-card-header">修改密码div>
        <div class="layui-card-body">
            <form class="layui-form">
                <div class="layui-form-item">
                    <label class="layui-form-label">原密码label>
                    <div class="layui-input-block">
                        <input type="password" name="oldPwd" required lay-verify="required|pwd" placeholder="请输入原密码"
                            autocomplete="off" class="layui-input" />
                    div>
                div>
                <div class="layui-form-item">
                    <label class="layui-form-label">新密码label>
                    <div class="layui-input-block">
                        <input type="password" name="newPwd" required lay-verify="required|pwd|samePwd"
                            placeholder="请输入新密码" autocomplete="off" class="layui-input" />
                    div>
                div>
                <div class="layui-form-item">
                    <label class="layui-form-label">确认新密码label>
                    <div class="layui-input-block">
                        <input type="password" name="rePwd" required lay-verify="required|pwd|rePwd"
                            placeholder="请再次确认密码" autocomplete="off" class="layui-input" />
                    div>
                div>
                <div class="layui-form-item">
                    <div class="layui-input-block">
                        <button class="layui-btn" lay-submit lay-filter="formDemo">修改密码button>
                        <button type="reset" class="layui-btn layui-btn-primary">重置button>
                    div>
                div>
            form>
        div>
    div>

    
    <script src="/assets/lib/layui/layui.all.js">script>
    
    <script src="/assets/lib/jquery.js">script>
    
    <script src="/assets/js/baseAPI.js">script>
    
    <script src="/assets/js/user/user_pwd.js">script>

body>

html>

index.html


<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    
    <link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
    
    <link rel="stylesheet" href="/assets/fonts/iconfont.css">
    
    <link rel="stylesheet" href="/assets/css/index.css">
head>

<body class="layui-layout-body">
    <div class="layui-layout layui-layout-admin">
        <div class="layui-header">
            <div class="layui-logo">
                <img src="/assets/images/logo.png" alt="">
            div>
            
            <ul class="layui-nav layui-layout-right">
                <li class="layui-nav-item">
                    <a href="javascript:;" class="userInfo">
                        <img src="http://tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg"
                            class="layui-nav-img">
                        <span class="text-avatar">Aspan>
                        个人中心
                    a>
                    <dl class="layui-nav-child">
                        <dd><a href="/user/user_info.html" target="fm">基本资料a>dd>
                        <dd><a href="/user/user_avatar.html" target="fm">更换头像a>dd>
                        <dd><a href="/user/user_pwd.html" target="fm">重置密码a>dd>
                    dl>
                li>
                <li class="layui-nav-item">
                    <a href="javascript:;" id="btnLogout">
                        <span class="iconfont icon-tuichu">span>
                        退出
                    a>
                li>
            ul>
        div>
        <div class="layui-side layui-bg-black">
            <div class="layui-side-scroll">
                <div class="userInfo">
                    <img src="http://tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg"
                        class="layui-nav-img">
                    <span class="text-avatar">Aspan>
                    <span id="welcome">
                        欢迎 ***
                    span>
                div>
                
                <ul class="layui-nav layui-nav-tree" lay-shrink="all">
                    <li class="layui-nav-item layui-this">
                        <a href="/home/dashboard.html" target="fm">
                            <span class="iconfont icon-home">span>
                            首页
                        a>
                    li>
                    <li class="layui-nav-item">
                        <a class="" href="javascript:;">
                            <span class="iconfont icon-16">span>
                            文章管理
                        a>
                        <dl class="layui-nav-child">
                            <dd>
                                <a href="/article/art_cate.html" target="fm">
                                    <i class="layui-icon layui-icon-app">i>
                                    文章类别
                                a>
                            dd>
                            <dd>
                                <a href="/article/art_list.html" target="fm">
                                    <i class="layui-icon layui-icon-app">i>
                                    文章列表
                                a>
                            dd>
                            <dd>
                                <a href="/article/art_pub.html" target="fm">
                                    <i class="layui-icon layui-icon-app">i>
                                    发布文章
                                a>
                            dd>
                        dl>
                    li>
                    <li class="layui-nav-item">
                        <a href="javascript:;">
                            <span class="iconfont icon-user">span>
                            个人中心
                        a>
                        <dl class="layui-nav-child">
                            <dd>
                                <a href="/user/user_info.html" target="fm">
                                    <i class="layui-icon layui-icon-app">i>
                                    基本资料
                                a>
                            dd>
                            <dd>
                                <a href="/user/user_avatar.html" target="fm">
                                    <i class="layui-icon layui-icon-app">i>
                                    更换头像
                                a>
                            dd>
                            <dd>
                                <a href="/user/user_pwd.html" target="fm">
                                    <i class="layui-icon layui-icon-app">i>
                                    重置密码
                                a>
                            dd>
                        dl>
                    li>
                ul>
            div>
        div>
        <div class="layui-body">
            
            <iframe name="fm" src="/home/dashboard.html" frameborder="0">iframe>
        div>
        <div class="layui-footer">
            
            © www.itheima.com - 黑马程序员
        div>
    div>
    
    <script src="/assets/lib/layui/layui.all.js">script>
    
    <script src="/assets/lib/jquery.js">script>
    
    <script src="/assets/js/baseAPI.js">script>
    导入自己的 JS 文件
    <script src="/assets/js/index.js">script>
body>

html>

login.html


<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>大事件-登录/注册title>
    
    <link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
    
    <link rel="stylesheet" href="/assets/css/login.css">
head>

<body>
    
    <div class="layui-main">
        <img src="/assets/images/logo.png" alt="">
    div>
    

    
    <div class="loginAndRegBox">
        <div class="title-box">div>
        
        <div class="login-box">
            
            <form class="layui-form" id="form_login">
                
                <div class="layui-form-item">
                    <i class="layui-icon layui-icon-username">i>
                    <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名"
                        autocomplete="off" class="layui-input" />
                div>
                
                
                <div class="layui-form-item">
                    <i class="layui-icon layui-icon-password">i>
                    <input type="password" name="password" required lay-verify="required|pwd" placeholder="请输入密码"
                        autocomplete="off" class="layui-input" />
                div>
                
                
                <div class="layui-form-item">
                    
                    <button class="layui-btn layui-btn-fluid layui-btn-normal" lay-submit>登录button>
                div>
                
                <div class="layui-form-item links">
                    <a href="javascript:;" id="link_reg">去注册账号a>
                div>
            form>
            
        div>
        
        
        <div class="reg-box">
            
            <form class="layui-form" id="form_reg">
                
                <div class="layui-form-item">
                    <i class="layui-icon layui-icon-username">i>
                    <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名"
                        autocomplete="off" class="layui-input" />
                div>
                
                
                <div class="layui-form-item">
                    <i class="layui-icon layui-icon-password">i>
                    <input type="password" name="password" required lay-verify="required|pwd" placeholder="请输入密码"
                        autocomplete="off" class="layui-input" />
                div>
                
                
                <div class="layui-form-item">
                    <i class="layui-icon layui-icon-password">i>
                    <input type="password" name="repassword" required lay-verify="required|pwd|repwd"
                        placeholder="再次确认密码" autocomplete="off" class="layui-input" />
                div>
                
                
                <div class="layui-form-item">
                    
                    <button class="layui-btn layui-btn-fluid layui-btn-normal" lay-submit>注册button>
                div>
                
                <div class="layui-form-item links">
                    <a href="javascript:;" id="link_login">去登录a>
                div>
            form>
            


        div>
        
    div>
    

    
    <script src="/assets/lib/layui/layui.all.js">script>
    
    <script src="/assets/lib/jquery.js">script>
    
    <script src="/assets/js/baseAPI.js">script>
    
    <script src="/assets/js/login.js">script>
body>

html>

大事件项目效果

【15】大事件项目:附-大事件项目源码、大事件项目效果_第5张图片
【15】大事件项目:附-大事件项目源码、大事件项目效果_第6张图片
【15】大事件项目:附-大事件项目源码、大事件项目效果_第7张图片
【15】大事件项目:附-大事件项目源码、大事件项目效果_第8张图片
【15】大事件项目:附-大事件项目源码、大事件项目效果_第9张图片
【15】大事件项目:附-大事件项目源码、大事件项目效果_第10张图片
【15】大事件项目:附-大事件项目源码、大事件项目效果_第11张图片
【15】大事件项目:附-大事件项目源码、大事件项目效果_第12张图片
【15】大事件项目:附-大事件项目源码、大事件项目效果_第13张图片

你可能感兴趣的:(前端,html,css,jquery,ajax,layui框架)