one-pyy / amis_helper

方便部署amis的小玩意, 适用于fastapi(flask可能改改也行)
3 stars 2 forks source link

咋不行 #1

Closed wanghaisheng closed 1 year ago

wanghaisheng commented 2 years ago

https://user-images.githubusercontent.com/2363295/172874532-dcd234e8-8af7-4ca2-bcac-4589ca2e567d.mp4

one-pyy commented 2 years ago

啊这, 我没写清楚, 路径是不用加第一个杠的

one-pyy commented 2 years ago

另外, 访问的时候是/amis/get/+你的路径

wanghaisheng commented 2 years ago

成功了 另外我想请教下 如果要拿数据或者刷新数据到界面上,能不能写个fastapi的简单例子 api: '/saveForm', { type: 'page', title: '表单页面', body: { type: 'form', mode: 'horizontal', api: '/saveForm', body: [ { label: 'Name', type: 'input-text', name: 'name' }, { label: 'Email', type: 'input-email', name: 'email' } ] } }

wanghaisheng commented 2 years ago

明天我就把你这个套到这里去 https://github.com/wanghaisheng/python-desktop-app-amis-starter

one-pyy commented 2 years ago

可以去fastapi官网看看, 基础的都是有中文的https://fastapi.tiangolo.com/zh/

此外amis一般用可视化编辑器来着

one-pyy commented 2 years ago

当然, 你也可以看https://github.com/one-pyy/amis_helper/blob/main/fastapiHelper/amisHelper/main.py稍微了解一下

one-pyy commented 2 years ago

一般来说, 表单会用json发, 那么你要设定fastapi的post路由, 以及它的这两个参数为你发过去的参数。 返回的话就返回json即可。

wanghaisheng commented 2 years ago

fastapi 的get post这些我能写 以前用过一点

我现在跑起来form不能录入数据。。。 json我从官网demo里抠出来的 直接填在了index.html里 https://github.com/wanghaisheng/python-desktop-app-amis-starter/blob/main/templates/index.html 但我并没有在json里看到用的是post 还是put之类 的方法明确写出来 只有一个endpoint

wanghaisheng commented 2 years ago

@one-pyy 我想问 browser模式下 修改已有的貌似直接改然后提交 但是删除这些方法是没有暴露在页面上吗

另外就是gui模式下,加载已有的貌似也修改不了内容 你这边有尝试成功吗

github.com:wanghaisheng/python-desktop-app-amis-starter.git 我把目录结构这么调整了一下 目前唯一我搞不清楚逻辑的是 app.py里面 startAmisApp(app,"/amis/get/home")

这里应该和正常的项目endpoint一样,比如我通过admin新增了home,privacy两个页面 入口是home ,footer里有个href指向privacy界面

startAmisApp(app,"/home") 我有些吃不准的是 原来的amishelper/main.py里 我改成这样 其他没动


  @functools.lru_cache(maxsize=None)
  def getAmis(path:str=Path(...)):
    context=sql.get("select title,json from amis where path=??",path)
    if context.__len__()==0:
      return Response(status_code=404)
    return HTMLResponse(amisLoad(context[0][0],context[0][1]))
  api.get('/{path:path}')(getAmis)

  @api.get("/home")
  def setAmisHTML():
    from .amisTemplate import setAmis
    return HTMLResponse(amisLoad(setAmis[0],setAmis[1]))

  app.include_router(api, prefix='/', tags=['app'])
one-pyy commented 2 years ago

点路径那里的下拉框, 右边有个叉, 这个就是删除

one-pyy commented 2 years ago

另外GUI模式的本意是, 你通过这个set界面把该写的写好了, 然后把index界面给你自己的index, 我这个set界面就彻底隐藏(访问不到, 也改不了)

one-pyy commented 2 years ago

另外, 你要注意你写的是@api.get, 而api相对于app有一个前缀, 就是/amis/ (蓝图功能)

wanghaisheng commented 2 years ago

我也是这么理解 比如我是管理员/开发,写一个新的demo 起一个editor 拖拽好json,然后进入set界面/admin管理界面,新增好endpoint,再配上正常的后台api实现 就是一套完整的系统 这边好了以后

对于运营/用户,要使用就有2个option

一个是browser这种 可能需要一个server来发布 用户浏览器访问 一个是gui这种 打包成exe这种 所以就有了这些尝试性的想法,因为set界面背后的也是一样,基本上是现成的,复用这一套来写自己的index或者app

one-pyy commented 2 years ago

fastapi 的get post这些我能写 以前用过一点

我现在跑起来form不能录入数据。。。 json我从官网demo里抠出来的 直接填在了index.html里 https://github.com/wanghaisheng/python-desktop-app-amis-starter/blob/main/templates/index.html 但我并没有在json里看到用的是post 还是put之类 的方法明确写出来 只有一个endpoint

一般来说, 建议用amis官方的amis-editor直接拖。当然这个有一小部分功能不全, 但我个人是先直接用这个搭, 然后再自己改一些。选择post还是get提交表单是有这个选项的(以及json或者form啥啥的)

one-pyy commented 2 years ago

我也是这么理解 比如我是管理员/开发,写一个新的demo 起一个editor 拖拽好json,然后进入set界面/admin管理界面,新增好endpoint,再配上正常的后台api实现 就是一套完整的系统 这边好了以后

对于运营/用户,要使用就有2个option

一个是browser这种 可能需要一个server来发布 用户浏览器访问 一个是gui这种 打包成exe这种 所以就有了这些尝试性的想法,因为set界面背后的也是一样,基本上是现成的,复用这一套来写自己的index或者app

emmmmmmmmmm, 所以要是你想用GUI里面改界面的话大概是做不到的233

wanghaisheng commented 2 years ago

amis-editor这个我已经选了Vue的版本就挺好用

不是用gui该界面 而是最终发布形式成gui,这种方式也有一些应用场景和市场 打包成gui恰好我之前就有用pywebview套在flask app、fastapi app上的写法

我一直在找如何把fastapi开发的bs发布成gui和browser两种版本 之前我用pywebio写过几个简单界面,不尽如意,看到amis有点心动

之所以会出现这个尝试 是因为你本来代码里有那部分用gui录入json我试了一下没成功 前面就提了一嘴

one-pyy commented 2 years ago

amis-editor这个我已经选了Vue的版本就挺好用

不是用gui该界面 而是最终发布形式成gui,这种方式也有一些应用场景和市场 打包成gui恰好我之前就有用pywebview套在flask app、fastapi app上的写法

之所以会出现这个尝试 是因为你本来代码里有那部分用gui录入json我试了一下没成功 前面就提了一嘴

哦哦, 反正GUI录入比较麻烦, 开发也犯不着用这个做。

说起来, 之前我试过用pyinstaller打包这个GUI, 但出来有90兆()

wanghaisheng commented 2 years ago

是 我也看到有人说pywebview出来包很大 https://github.com/snwjas/RandomDesktopBackground-WEBUI

但我看这个repo 好像就直接打包的 不知道能不能参考

我看到你这个 就想用你这套试试能不能remake他这个壁纸替换

one-pyy commented 2 years ago

好耶, 学到了

wanghaisheng commented 2 years ago

我到现在没太想通 他那个是vue amis又没有序列化的文件,就是数据库通信,是不是更简单,相当于一个纯python

one-pyy commented 2 years ago

虽然但是, https://github.com/snwjas/RandomDesktopBackground-WEBUI/blob/master/bulid-win/build.bat 好像他也是用的pyinstaller

wanghaisheng commented 2 years ago

https://github.com/snwjas/RandomDesktopBackground-WEBUI/blob/master/bulid-win/application.spec 这个文件应该是自动生成基础上改过的

one-pyy commented 2 years ago

emmmmmmmm, 粗略看了一下, 好像他的意思是不要pywebview(因为浏览器人人都有, 所以直接让用户访问这个网址)

也可能是我眼神不好? 反正我目前理解下来是这个意思

wanghaisheng commented 2 years ago
"BuildWeb": "npm run CleanWebBuild && parcel build src/vue/public/index.html --no-source-maps --public-url . --cache-dir build/.bcache --dist-dir build/webui",

package.json 里他把前端也就是vue代码打包到webui这个文件夹下面

         datas=[
             ('cmdtransmitter.exe', '.'),
             (os.path.join(root_path, 'rdbdb.db'), '.'),
             (os.path.join(src_path, 'webui'), 'webui'),
         ],

pyinstaller打包的时候又以data形式引入了这个文件夹

最终得到的也是个独立exe 我没有windows电脑 但看界面应该不是直接访问浏览器也可能我误解了

one-pyy commented 2 years ago

image emmmmmmmmm, 然而他是这么说的, 也就是让我们自己访问

(其实pywebview好像是用了pyside2里面带的浏览器模块吧? )

wanghaisheng commented 2 years ago
import application as app
if utils.is_process_running(configr.get_fpid(), app.app_fullpath):
    __open_webui()
    return
try:
    # 进程启动
    if run_args.get(argsdef.ARG_KEY_ENV) == argsdef.ARG_ENV_TYPE_PROD:
        uvicorn.run("webapp:app", host=const.host, port=const.port)
    else:
        uvicorn.run("webapp:app", host=const.host, port=const.port, reload=True, debug=True)
except Exception as e:
    log.error('WEBUI服务启动失败,{}'.format(e))
    utils.create_dialog("WEBUI服务启动失败!", const.dialog_title,
                        style=win32con.MB_ICONERROR, interval=7,
                        callback=lambda x: utils.kill_process([os.getpid()]))

这个启动方式能在服务开启时自动拉起浏览器 访问地址吗

wanghaisheng commented 2 years ago

如果能 那就简单了 fastapi的app启动时拉起amis默认配置的首页就行了 相当于启动时访问 /home这个url amis再渲染 一气呵成

one-pyy commented 1 year ago

可以往里再加一行命令执行啥的(大概)