不懂就问,静态网页管理动态数据如何实现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
QingquanBaby
V2EX    程序员

不懂就问,静态网页管理动态数据如何实现

  •  
      QingquanBaby 2023-07-26 22:25:28 +08:00 2121 次点击
    这是一个创建于 814 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求:
    1用浏览器就能打开的,国产麒麟+Linux+Windows 通用
    2最好不建立 web 监听端口或者服务之类的,也不需要数据库
    3能够简单地管理一些数据,比如这次打开 index.html 录入一条数据,下次打开还能读取到这条数据
    4数据存在 index.html 同目录下即可,存储方式不限
    5如果必须要建立监听后者服务等,启动浏览器时启动,关闭浏览器时监听也关闭

    V 友们能帮忙想想有啥好的办法没,如果有合适的方案,小红包送你
    25 条回复    2023-07-28 09:16:12 +08:00
    lanlanye
        1
    lanlanye  
       2023-07-26 22:29:15 +08:00 via iPhone
    你这个静态……指的是浏览器打开本机文件?还是要放在服务器上?
    looking0truth
        2
    looking0truth  
       2023-07-26 22:43:50 +08:00
    Chrome 支持读写本地文件
    QingquanBaby
        3
    QingquanBaby  
    OP
       2023-07-26 22:44:52 +08:00
    @lanlanye 本机文件,类似于绿色版的软件(这个软件是网页)
    hamsterbase
        4
    hamsterbase  
       2023-07-26 22:49:11 +08:00
    1. 访问 https://vscode.dev/

    2. 打开本地文件夹

    3. 编辑文本, 可以直接保存在硬盘。
    hamsterbase
        5
    hamsterbase  
       2023-07-26 22:50:46 +08:00
    如果你写的是 markdown ,可以在 vs code 里实时预览。
    如果你写的是 html ,可以另外开一个窗口,打开这个 html 。
    flyqie
        6
    flyqie  
       2023-07-26 22:52:05 +08:00
    没记错的话,纯本地 index.html 打开即用且数据保存到同目录下没法做。
    x77
        7
    x77  
       2023-07-26 22:54:57 +08:00
    1-4:很多 Web 框架支持数据存储,有的甚至支持本地数据库,数据仅存储于客户端(浏览器)本地,与服务器没无关
    5:没有监听,启动浏览器就读取/加载数据。用户操作浏览器(清理缓存)可以删除数据

    参考实例(该页面暂不支持移动端): https://ai.xinlake.dev
    这个页面的设置存储就是 Flutter 框架支持的本地数据库及数据存储。
    QingquanBaby
        8
    QingquanBaby  
    OP
       2023-07-26 22:57:43 +08:00
    @hamsterbase 不联网可以实现吗
    hamsterbase
        9
    hamsterbase  
       2023-07-26 23:06:32 +08:00
    @QingquanBaby 这个不太清楚 ,可以网上搜搜看有没有现成的。
    chihiro2014
        10
    chihiro2014  
       2023-07-26 23:11:26 +08:00
    sqlite?
    placeholder
        11
    placeholder  
       2023-07-27 08:15:24 +08:00   1
    数据你简单说说是啥数据,key:value 这种直接存 locale storage 不行吗?

    复杂一点的数据、文件看看 indexedDB 呢,也是本地存储,我看 edge 、firefox 、chrome 都支持。这仨浏览器基本覆盖你说的三个系统了吧。

    不过这种保存方式保证不了持久化就是了,客户卸载浏览器或者清除浏览器缓存就没了
    QingquanBaby
        12
    QingquanBaby  
    OP
       2023-07-27 09:18:04 +08:00
    @placeholder 这种方式可以将数据做导入导出吗,可以的话就不用管浏览器缓存之类的了
    QingquanBaby
        13
    QingquanBaby  
    OP
       2023-07-27 09:19:26 +08:00
    @chihiro2014 sqlite 对数据的存取很好用,但是需要搞一个监听,这个监听我暂时还没想到可控的办法
    QingquanBaby
        14/span>
    QingquanBaby  
    OP
       2023-07-27 09:23:49 +08:00
    @placeholder 感觉可行,正在看
    macy
        15
    macy  
       2023-07-27 09:53:39 +08:00
    chrome 存在 indexdb 里面,就行,只要别卸载浏览器或者手动把 indexdb 的数据库删除掉,数据都在
    isSamle
        16
    isSamle  
       2023-07-27 10:56:06 +08:00
    本地数据库可以实现吧,sql.js 读写本地 db 文件试下
    isSamle
        17
    isSamle  
       2023-07-27 11:01:39 +08:00
    我之前 Vue-Electron 研究了一段时间的本地存储,可以参考下我这个项目[GhostWriter]( https://github.com/MarkSamle/GhostWriter),理论上来讲,应该可以在本地保存一个 db 文件,然后通过相关方法读写,配合 sql.js 写一个本地数据库操作的 js 文件用来实现类似 api 的功能应该就行了
    awsl2333
        18
    awsl2333  
       2023-07-27 12:32:17 +08:00
    你这个做个 electron 就行吧
    lujiaxing
        19
    lujiaxing  
       2023-07-27 13:39:40 +08:00
    有没有听说过有一个东西叫 localstorage ?

    ```
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta name="Content-Type" cOntent="text/html;charset=">
    <title>Local Storage Test</title>
    <script language="Javascript" type="text/Javascript">
    function writeLocalStorage(text) {

    localStorage.setItem("test", text);
    }

    function loadLocalStorage() {
    return localStorage.getItem("test");
    }

    function save() {
    var targetCOntrol= document.getElementById("valueInput");
    writeLocalStorage(targetControl.value);
    }

    function init() {
    var targetCOntrol= document.getElementById("valueInput");
    var value = loadLocalStorage();

    targetControl.value = value;
    }

    </script>
    <style type="text/css">
    .demo-area {
    width: 640px;
    height: 480px;
    text-align: center;
    position: absolute;
    left: calc(50% - 320px);
    top: calc(50% - 240px);
    background-color: #0000FF11;
    border-radius: 5px;
    font-size: 14pt;
    }
    </style>
    </head>
    <body Onload="init()">
    <div class="demo-area">
    <br /><br /><br /><br />
    <br /><br /><br /><br />
    <span>
    <label for="valueInput">值: </label>
    <input type="text" value="" id="valueInput" name="valueInput" />
    </span>
    <br /><br />
    <button Onclick="save()">保存</button>
    </div>
    </body>
    </html>
    ```
    lujiaxing
        20
    lujiaxing  
       2023-07-27 13:44:56 +08:00
    md 什么时候 V2EX 能支持贴代码呢
    QingquanBaby
        21
    QingquanBaby  
    OP
       2023-07-27 14:51:00 +08:00
    @lujiaxing 保存后的数据能否导出呢,有一个需求是比如我保存了一些值,需要在其他电脑上看(不能联网传输)
    lujiaxing
        22
    lujiaxing  
       2023-07-27 15:05:52 +08:00
    @QingquanBaby 可以. 你把 数据按逗号跟换行符分割, 保存成 csv 文件然后转为 blob 链接给用户下载 (或自动触发链接点击事件弹出下载) 就行, 导出的文件 EXCEL 都能打开.
    placeholder
        23
    placeholder  
       2023-07-27 16:31:50 +08:00
    @QingquanBaby 做不到后台静默导入导出,导出我想到的就是造个文件然后通过浏览器下载到本地,导入也得手动选择文件上传,

    导出你可以看看 file saver 这个 npm 包,导入不知道,我没做过
    lujiaxing
        24
    lujiaxing  
       2023-07-27 21:09:58 +08:00
    @placeholder 静默导出不太可能. 毕竟浏览器不可能背着用户写硬盘, 更何况程序自以为是保存的地方可能根本不是用户找得到的. 不过导出成 blob url 直接下载不是什么难事儿.

    ```
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta name="Content-Type" cOntent="text/html;charset=">
    <title>Local Storage Test</title>
    <script language="Javascript" type="text/Javascript">
    ......
    ......
    ......

    function exportContent(){
    var targetCOntrol= document.getElementById("valueInput");
    var encoder = new TextEncoder();
    var encodedValue = encoder.encode(targetControl.value);

    var blob = new Blob([encodedValue], { type: "application/octet-stream" });

    var ancher = document.createElement("a");
    ancher.target = "_blank";
    ancher.download = (Math.random() + "").replace('.', '') + ".txt";
    ancher.href = URL.createObjectURL(blob);
    ancher.click();
    }

    </script>
    <style type="text/css">
    ......
    ......
    ......
    </head>
    <body Onload="init()">
    <div class="demo-area">
    ......
    ......
    ......
    <button Onclick="save()">保存</button>
    &nbsp;
    <button Onclick="exportContent()">导出</button>
    </div>
    </body>
    </html>
    ```

    点导出就可以下载输入框里的文件.
    所有支持 HTML 5 都可以.
    不支持 HTML 5 的浏览器最多就是下载的文件变成了 GUID 没有后缀名罢了.
    placeholder
        25
    placeholder  
       2023-07-28 09:16:12 +08:00
    @lujiaxing 学习了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2670 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 09:44 PVG 17:44 LAX 02:44 JFK 05:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86