二次开发__单页制作教程 For Discuz!X2(DIY/左右边栏/标签选项卡)

转载自:http://kx9h.com/forum.php?mod=viewthread&tid=49159&from=portal,如需转载请注明此出处


资源名称: 单页制作教程 原创作者: 体无完肤 适用版本: Discuz! X2.0  语言编码: GBK UTF8 BIG5 TC_UTF8  

本次教程相对于以前版本的单页制作教程的区别:
修复Discuz!X2单页DIY后无法保存的问题;

首先,单页包括该单页的php文件和该单页的模板(.htm)文件,比如:host.php、host.htm

普通单页的php文件内容如下:

<?php
define('CURSCRIPT', 'test');
require './source/class/class_core.php';//引入系统核心文件
$discuz = & discuz_core::instance();//以下代码为创建及初始化对象
$discuz->init();
$navtitle = '官方QQ群列表';
$metakeywords = 'QQ群,官方,discuz,DRC,7drc,QQ';
$metadescription = '该页面展示Discuz! Rescue Centre 官方QQ群系,加入本站官方QQ群可及时了解掌握最新动态、插件、模版第一手信息。请勿加入多个QQ群,珍惜有限的群资源。';
include template('forum/host');//调用单页模版文件
?>

这里需要注意的是,host为模板文件名,不需要加.htm扩展名,模板文件存放于默认风格目录下的forum目录;
单页的php文件存放于论坛根目录;

$navtitle = '官方QQ群列表'; 这一句是定义单页的标题,显示于浏览器顶部的网页标题
$metakeywords = 'QQ群,官方,discuz,DRC,7drc,QQ'; 是单页的关键词信息
$metadescription 是单页的描述信息。

可DIY的单页PHP文件代码内容如下:

<?php
define('CURSCRIPT', 'test');
require './source/class/class_core.php';//引入系统核心文件
$discuz = & discuz_core::instance();//以下代码为创建及初始化对象
$discuz->init();
loadcache('diytemplatename');
$navtitle = '官方QQ群列表';
$metakeywords = 'QQ群,官方,discuz,DRC,7drc,QQ';
$metadescription = '该页面展示Discuz! Rescue Centre 官方QQ群系,加入本站官方QQ群可及时了解掌握最新动态、插件、模版第一手信息。请勿加入多个QQ群,珍惜有限的群资源。';
include template('diy:forum/host');//调用单页模版文件
?>

注:其中 loadcache('diytemplatename'); 为Discuz!X2对DIY这一块做的更新,DIY要载入缓存,所以以前X1.5的单页制作教程做出来的单页DIY会无法保存。DIY的单页模版文件,修改单页模版内容后需要更新缓存才能刷新出来。


php文件创建完毕,现在开始创建模版文件,基本代码如下:


普通单页的模版文件代码:

<!--{template common/header}-->
<div id="pt" class="bm cl">
<div class="z">
<a href="./" class="nvhm" title="{lang homepage}">$_G[setting][bbname]</a><em>»</em>
<a href="forum.php">$_G[setting][bbname]</a><em>»</em>
<a href="javascript:;">$navtitle</a>
</div>
</div>
<div id="ct" class="wp cl">
<div class="mn bm cl">
<div class="bm_c">
<p style="width:300px; margin:200px auto; text-align:center;">这里是单页正文内容区域</p> 
</div>
</div>
</div>
<!--{template common/footer}-->

可DIY的单页模版文件代码如下:

<!--{template common/header}-->
<div id="pt" class="bm cl">
<div class="z">
<a href="./" class="nvhm" title="{lang homepage}">$_G[setting][bbname]</a><em>»</em>
<a href="forum.php">$_G[setting][bbname]</a><em>»</em>
<a href="javascript:;">$navtitle</a>
</div>
</div>
<style id="diy_style" type="text/css"></style><!--非常重要,保存diy样式,没有则不能正常运行-->
<div class="wp">
<!--[diy=diy2]--><div id="diy2" class="area"></div><!--[/diy]-->
</div>


<div id="ct" class="wp cl">
<div class="mn bm cl">
<div class="bm_c">

<p style="width:300px; margin:200px auto; text-align:center;">这里是单页正文内容区域</p>

</div>
</div>
</div>

<!--{template common/footer}-->

其中:

<div class="wp">
<!--[diy=diy2]--><div id="diy2" class="area"></div><!--[/diy]-->
</div>

这段代码就是DIY区域的代码,之前X1.5的单页教程里面我们也讲到过,可以在单页的任意位置插入DIY区域,即:

<!--[diy=diy2]--><div id="diy2" class="area"></div><!--[/diy]-->

注意:如果一个页面要插入多个DIY区域,注意修改上面DIY区域的编号ID,几个DIY区域的ID编号不能相同。

带有右侧边栏的单页模版文件代码:

<!--{subtemplate common/header}-->

<div id="pt" class="bm cl">
<div class="z">
<a href="./" class="nvhm" title="{lang homepage}">$_G[setting][bbname]</a><em>»</em>
<a href="forum.php">$_G[setting][bbname]</a><em>»</em>
<a href="javascript:;">$navtitle</a>
</div>
</div>

<div id="ct" class="wp cl ct2">
<div class="mn bm cl">
<div class="bm_h">标题栏</div>
<div class="bm_c">

<p style="width:300px; margin:220px auto; text-align:center;">这里是单页正文内容区域</p>

</div>
</div>

<div class="sd">

<div class="bm">
<div class="bm_h">
<h2>公告栏</h2>
</div>
<div class="bm_c">
<p class="xl xl2 cl" style="line-height:25px;">
这里可以放一些公告通知类的文字内容这里可以放一些公告通知类的文字内容这里可以放一些公告通知类的文字内容这里可以放一些公告通知类的文字内容这里可以放一些公告通知类的文字内容这里可以放一些公告通知类的文字内容
</p>
</div>
</div>

<div class="bm">
<div class="bm_h">
<h2>操作菜单</h2>
</div>
<div class="bm_c">
<ul class="xl xl2 cl">
<li><a href="#">测试菜单一</a></li>
<li><a href="#">测试菜单二</a></li>
<li><a href="#">测试菜单三</a></li>
<li><a href="#">测试菜单四</a></li>
<li><a href="#">测试菜单五</a></li>
<li><a href="#">测试菜单六</a></li>
</ul>
</div>
</div>


<div class="bm">
<div class="bm_h">
<h2>版权信息</h2>
</div>
<div class="bm_c" style="line-height:25px;">
<ul>
<li>作者:<a href="http://www.mutoulee.cn" target="_blank">体无完肤</a></li>
<li>网站:<a href="http://bbs.7drc.com" target="_blank">bbs.7drc.com</a></li>
<li>版权:Discuz! Rescue Centre</li>
</ul>
</div>
</div>

</div>

</div>

<!--{subtemplate common/footer}-->


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文将介绍如何使用 Vue 和 Flask 搭建一个具有登录、注册、权限控制等基础功能的后台管理系统。 首先,我们需要准备以下环境: 1. Python3.x 2. Flask 3. Flask-RESTful 4. Flask-JWT-Extended 5. Vue.js 6. Vue Router 7. Element UI 接下来,我们开始搭建后台管理系统。 1. 安装 Flask 和相关扩展 使用 Python3.x 版本安装 Flask 和相关扩展,可以使用 pip 工具,执行以下命令: ``` pip install flask Flask-RESTful Flask-JWT-Extended ``` 2. 创建 Flask 应用 在项目根目录创建一个 app.py 文件,编写以下代码: ```python from flask import Flask, jsonify from flask_restful import Api from flask_jwt_extended import JWTManager app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'jwt-secret-string' api = Api(app) jwt = JWTManager(app) @app.route('/ping') def ping(): return jsonify({'message': 'pong'}) if __name__ == '__main__': app.run(debug=True) ``` 上面的代码创建了一个 Flask 应用,并注册了一个 `/ping` 路由,用于测试应用是否正常运行。 3. 创建 Vue 项目 使用 Vue CLI 创建一个新的 Vue 项目,执行以下命令: ``` vue create vue-admin ``` 安装 Element UI 和 Vue Router,执行以下命令: ``` cd vue-admin npm install element-ui vue-router --save ``` 4. 配置 Vue Router 打开 src/router/index.js 文件,编写以下代码: ```javascript import Vue from 'vue' import Router from 'vue-router' import Home from '@/views/Home.vue' import Login from '@/views/Login.vue' Vue.use(Router) const router = new Router({ routes: [ { path: '/', name: 'home', component: Home }, { path: '/login', name: 'login', component: Login } ] }) export default router ``` 上面的代码定义了两个路由,一个是首页路由 `/`,一个是登录页路由 `/login`。 5. 创建登录页 在 src/views 目录下创建 Login.vue 文件,编写以下代码: ```html <template> <div class="login"> <el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="form.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handleSubmit">登录</el-button> </el-form-item> </el-form> </div> </template> <script> export default { data() { return { form: { username: '', password: '' }, rules: { username: [{ required: true, message: '请输入用户名', trigger: 'blur' }], password: [{ required: true, message: '请输入密码', trigger: 'blur' }] } } }, methods: { handleSubmit() { this.$refs.form.validate(valid => { if (valid) { console.log('submit', this.form) } else { console.log('validate failed') return false } }) } } } </script> <style scoped> .login { width: 400px; margin: 0 auto; padding-top: 100px; } </style> ``` 上面的代码创建了一个登录表单,用于用户登录,表单提交时会调用 handleSubmit 方法。 6. 实现登录功能 打开 src/views/Login.vue 文件,修改 handleSubmit 方法,使用 axios 发送登录请求,如下: ```javascript handleSubmit() { this.$refs.form.validate(valid => { if (valid) { axios.post('/api/auth/login', this.form) .then(({ data }) => { console.log('login success', data) localStorage.setItem('jwt', data.access_token) this.$router.push('/') }) .catch(err => console.error(err)) } else { console.log('validate failed') return false } }) } ``` 上面的代码使用 axios 发送登录请求,将登录成功后返回的 access_token 存储在 localStorage 中,并跳转到首页。 7. 添加路由守卫 打开 src/router/index.js 文件,添加路由守卫,如下: ```javascript import Vue from 'vue' import Router from 'vue-router' import Home from '@/views/Home.vue' import Login from '@/views/Login.vue' Vue.use(Router) const router = new Router({ routes: [ { path: '/', name: 'home', component: Home, meta: { requiresAuth: true } }, { path: '/login', name: 'login', component: Login } ] }) router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { const jwt = localStorage.getItem('jwt') if (!jwt) { next('/login') } else { next() } } else { next() } }) export default router ``` 上面的代码添加了路由守卫,如果用户未登录,访问需要认证的路由时会自动跳转到登录页。 8. 实现 Flask API 在 app.py 文件中添加以下代码: ```python from flask_restful import Resource, reqparse from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity parser = reqparse.RequestParser() parser.add_argument('username', type=str, required=True, help='Username required') parser.add_argument('password', type=str, required=True, help='Password required') class Auth(Resource): def post(self): args = parser.parse_args() username = args['username'] password = args['password'] if username == 'admin' and password == 'admin': access_token = create_access_token(identity=username) return {'access_token': access_token}, 200 else: return {'message': 'Invalid credentials'}, 401 class User(Resource): @jwt_required def get(self): current_user = get_jwt_identity() return {'username': current_user}, 200 api.add_resource(Auth, '/api/auth/login') api.add_resource(User, '/api/user') ``` 上面的代码实现了两个 API 接口,一个是登录接口 `/api/auth/login`,一个是获取当前用户接口 `/api/user`,这两个接口都需要认证才能访问。 9. 实现 Element UI 布局 打开 src/App.vue 文件,编写以下代码: ```html <template> <div class="app"> <el-container style="height: 100%;"> <el-header style="height: 60px; line-height: 60px;"> <el-row> <el-col :span="12"> <h1 style="color: #fff; margin-left: 20px;">后台管理系统</h1> </el-col> <el-col :span="12"> <div style="float: right; margin-right: 20px;"> <el-dropdown> <span class="el-dropdown-link"> <i class="el-icon-user"></i> {{ username }} <i class="el-icon-arrow-down el-icon--right"></i> </span> <el-dropdown-menu slot="dropdown"> <el-dropdown-item @click="handleLogout">退出登录</el-dropdown-item> </el-dropdown-menu> </el-dropdown> </div> </el-col> </el-row> </el-header> <el-container> <el-aside style="width: 200px;"> <el-menu default-active="1" class="el-menu-vertical-demo" :router="true" :collapse="isCollapse"> <el-submenu index="1"> <template slot="title"> <i class="el-icon-menu"></i> <span>菜单1</span> </template> <el-menu-item index="/menu1/page1">页面1</el-menu-item> <el-menu-item index="/menu1/page2">页面2</el-menu-item> </el-submenu> <el-submenu index="2"> <template slot="title"> <i class="el-icon-setting"></i> <span>菜单2</span> </template> <el-menu-item index="/menu2/page1">页面1</el-menu-item> <el-menu-item index="/menu2/page2">页面2</el-menu-item> </el-submenu> </el-menu> </el-aside> <el-main> <router-view></router-view> </el-main> </el-container> </el-container> </div> </template> <script> import axios from 'axios' export default { data() { return { username: '', isCollapse: false } }, mounted() { axios.get('/api/user') .then(({ data }) => { console.log('get user', data) this.username = data.username }) .catch(err => console.error(err)) }, methods: { handleLogout() { localStorage.removeItem('jwt') this.$router.push('/login') } } } </script> <style> .app { height: 100%; } </style> ``` 上面的代码使用 Element UI 实现了后台管理系统的布局,包括头部、侧边栏和主体区域。 10. 完成 至此,我们已经完成了一个基于 Vue 和 Flask 的后台管理系统的开发,具有登录、注册、权限控制等基础功能。后续可以根据项目需求进行功能扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值