python使用pywebview集成vue3和element-plus开发桌面系统框架

随着web技术越来越成熟,就连QQ的windows客户端都用web技术来开发,所以在未来,web技术来开发windows桌面软件也会越来越多,所以在此发展驱动之下,将最近流程的python与web技术相结合,使用vue3和element-plus、vue-router、saas(CSS扩展语言),来开发桌面管理系统,也是一个不错的选择。最主要的是两者技术门槛比较低,而且开发效率也很快,同时也可以做出漂亮的界面。

一、技术背景

python:版本号为3.7(你也可以换成高版本,同样支持)

vue3:版本为3.4.29

element-plus:版本号:element-plus

vue-router:版本号为4.4.0

sass:1.53.0

操作系统为:windows10

二、先看效果

三、web关键代码-登陆页面

<template>
  <div class="login-container">
    <h1>用户登录</h1>
    <form class="login-form">
      <div class="form-group">
        <label>用户名:</label>
        <input type="text"  />
      </div>
      <div class="form-group">
        <label>密码:</label>
        <input type="password" />
      </div>
      <button type="submit" @click="login">登录</button>
    </form>
  </div>
</template>


<script setup>
import {onMounted, getCurrentInstance,ref,computed} from "vue";
import {useStore} from "vuex";
const {proxy} = getCurrentInstance();
const login = async ()=>{
   window.pywebview.api.login('','')
}
</script>
<style lang="scss" scoped>
.login-container {
  max-width: 400px;
  margin: 0 auto;
  padding: 50px 20px;
  box-sizing: border-box;
  text-align: center;
}
.login-form {
  width: 80%;
  margin: 0 auto;
}
.form-group {
  margin-bottom: 20px;
  text-align: left;
}
label {
  display: inline-block;
  width: 100px;
}
</style>

四、web关键代码-首页

<template>
  <el-table :data="tableData" style="width: 100%">
    <el-table-column prop="date" label="Date" width="180" />
    <el-table-column prop="name" label="Name" width="180" />
    <el-table-column prop="address" label="Address" />
  </el-table>
</template>


<script setup>
    import {onMounted, getCurrentInstance,ref,computed} from "vue";
    import {useStore} from "vuex";
    const {proxy} = getCurrentInstance();
    const tableData = [
      {
        date: '2016-05-03',
        name: 'Tom',
        address: 'No. 189, Grove St, Los Angeles',
      },
      {
        date: '2016-05-02',
        name: 'Tom',
        address: 'No. 189, Grove St, Los Angeles',
      },
      {
        date: '2016-05-04',
        name: 'Tom',
        address: 'No. 189, Grove St, Los Angeles',
      },
      {
        date: '2016-05-01',
        name: 'Tom',
        address: 'No. 189, Grove St, Los Angeles',
      },
    ]
</script>
<style lang="scss" scoped>

</style>

五、pywebview关键代码

import webview

from controller.IndexController import IndexController


class Api():
    def destroy(self):
        window.destroy()

    def minimize(self):
        window.minimize()

    def login(self, username, password):
        print(username, '  ', password)
        main = IndexController(username)
        main.start()
        self.destroy()


if __name__ == '__main__':
    api = Api()
    # js_api 获得 api 实例
    window = webview.create_window('登录', 'http://localhost:3004/#/login', js_api=api, resizable=False, width=450,  frameless=False, shadow=True, height =670, background_color="#E4FBF0")
    webview.start()
    # webview.start(debug=True)

六、拿到代码执行如下命令

1、前端(必须先安装nodejs,百度自行先安装),进入到pywebview-desktop-app\web目录,执行如下命令,下载依赖

npm install

2、运行前端(在目录pywebview-desktop-app\web下),执行如下命令

npm run dev

3、启动python客户端,在pywebview-desktop-app\controller目录,运行LoginController.py文件

七、效果图如下

下载地址:链接:https://pan.baidu.com/s/1TH_UQx7sblW6O_6K6ZPqlA?pwd=thfk 
提取码:thfk

要在Vue3使用Element Plus进行附件上传,可以按照以下步骤进行操作: 1. 首先,需要安装Element Plusaxios插件: ``` npm install element-plus axios ``` 2. 在Vue项目的main.js文件中引入Element Plusaxios: ```javascript import { createApp } from &#39;vue&#39; import ElementPlus from &#39;element-plus&#39; import &#39;element-plus/lib/theme-chalk/index.css&#39; import axios from &#39;axios&#39; import App from &#39;./App.vue&#39; const app = createApp(App) app.use(ElementPlus) app.config.globalProperties.$axios = axios app.mount(&#39;#app&#39;) ``` 3. 在需要上传附件的组件中,可以使用Element Plus提供的el-upload组件进行上传,同时利用axios发送上传请求: ```vue <template> <el-upload class="upload-demo" action="/api/upload" :on-change="handleChange" :before-upload="beforeUpload" :file-list="fileList" multiple :limit="3" :on-exceed="handleExceed" :headers="headers"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </template> <script> export default { data() { return { fileList: [], headers: { Authorization: &#39;Bearer &#39; + localStorage.getItem(&#39;token&#39;), }, } }, methods: { handleChange(file, fileList) { console.log(file, fileList) }, beforeUpload(file) { const isJPG = file.type === &#39;image/jpeg&#39; || file.type === &#39;image/png&#39; const isLt500K = file.size / 1024 < 500 if (!isJPG) { this.$message.error(&#39;上传头像图片只能是 JPG/PNG 格式!&#39;) } if (!isLt500K) { this.$message.error(&#39;上传头像图片大小不能超过 500KB!&#39;) } return isJPG && isLt500K }, handleExceed(files, fileList) { this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${fileList.length + files.length} 个文件`) }, }, } </script> ``` 4. 在后端接口中,需要处理上传请求,并返回上传成功的信息: ```python @app.route(&#39;/api/upload&#39;, methods=[&#39;POST&#39;]) def upload_file(): if request.method == &#39;POST&#39;: file = request.files[&#39;file&#39;] if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(app.config[&#39;UPLOAD_FOLDER&#39;], filename)) return jsonify({&#39;success&#39;: True, &#39;filename&#39;: filename}) return jsonify({&#39;success&#39;: False}) ``` 其中,`allowed_file`函数可以用来限制上传文件的格式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值