1000 种工具

里面包含 1000 种工具

适配设备:Pro

作者:lrj

下载量:52 · 点赞:1

可信源码风险提示:保存或下载前请阅读源码和权限声明。
SHA-256e7fe712145d2e1eebab11a9e86514d326a1f6911c0eb6de30580711470573606
async function main() {
    const toast = script.toast;
    const contentWidth = typeof ui.getWidth === 'function' ? ui.getWidth() : 324;
    const pageIndex = ui.signal(0);
    const selectCategory = ui.signal(0);

    const categories = [
        { id: 0, name: "时间生活" },
        { id: 1, name: "饮食厨房" },
        { id: 2, name: "运动健康" },
        { id: 3, name: "理财记账" },
        { id: 4, name: "出行旅游" },
        { id: 5, name: "学习办公" },
        { id: 6, name: "作息闹钟计划" },
        { id: 7, name: "购物消费" },
        { id: 8, name: "家庭家务" },
        { id: 9, name: "情感社交" },
        { id: 10, name: "趣味抽签测试" },
        { id: 11, name: "计量单位换算" },
        { id: 12, name: "文本笔记小工具" },
        { id: 13, name: "密码隐私安全" },
        { id: 14, name: "收纳规划" },
        { id: 15, name: "天气生活参考" },
        { id: 16, name: "育儿生活" },
        { id: 17, name: "节日农历" },
        { id: 18, name: "随身简易计算" },
        { id: 19, name: "杂项生活小工具" }
    ];

    const toolList = [];

    // 0 时间生活 50
    for(let i = 0; i < 50; i++){
        toolList.push({
            cat:0,
            name:"时间生活"+(i+1),
            async handler(){
                if(i === 0){
                    const now=new Date();
                    await dialog.alert({
                        message:`现在本地时间
${now.getFullYear()}年${now.getMonth()+1}月${now.getDate()}日
${String(now.getHours()).padStart(2,'0')}:${String(now.getMinutes()).padStart(2,'0')}:${String(now.getSeconds()).padStart(2,'0')}
时间戳秒:${Math.floor(Date.now()/1000)}`
                    });
                }else if(i === 1){
                    const res=await dialog.number({title:"倒计时分钟数",value:5,min:1,max:180,decimals:0});
                    if(res.action!=='confirm') return;
                    toast(`设置${res.value}分钟提醒,脚本不要关闭`);
                    await new Promise(r=>setTimeout(r,res.value*60*1000));
                    await dialog.alert({title:"时间到!",message:`${res.value}分钟倒计时结束`});
                }else if(i === 2){
                    const resY=await dialog.number({title:"出生年份",value:2000,min:1920,max:2030,decimals:0});
                    const resM=await dialog.number({title:"出生月份",value:6,min:1,max:12,decimals:0});
                    const resD=await dialog.number({title:"出生日子",value:15,min:1,max:31,decimals:0});
                    if(resY.action==='confirm'&&resM.action==='confirm'&&resD.action==='confirm'){
                        const birth=new Date(resY.value,resM.value-1,resD.value);
                        const today=new Date();
                        let age=today.getFullYear()-birth.getFullYear();
                        if((today.getMonth()*100+today.getDate()) < (birth.getMonth()*100+birth.getDate())) age--;
                        await dialog.alert({message:`周岁年龄:${age}岁`});
                    }
                }else if(i === 3){
                    const res=await dialog.number({title:"输入天数",value:7,min:1,max:1000,decimals:0});
                    if(res.action==='confirm'){
                        const d=new Date(Date.now()+res.value*86400000);
                        await dialog.alert({message:`${res.value}天之后日期:\n${d.getFullYear()}-${d.getMonth()+1}-${d.getDate()}`});
                    }
                }else if(i === 4){
                    const res=await dialog.number({title:"过去N天",value:30,min:1,max:2000,decimals:0});
                    if(res.action==='confirm'){
                        const d=new Date(Date.now()-res.value*86400000);
                        await dialog.alert({message:`${res.value}天前日期:\n${d.getFullYear()}-${d.getMonth()+1}-${d.getDate()}`});
                    }
                }else if(i === 5){
                    const r1=await dialog.text({title:"日期A Y‑M‑D",value:"2026‑01‑01"});
                    const r2=await dialog.text({title:"日期B Y‑M‑D",value:"2026‑12‑31"});
                    if(r1.action==='confirm'&&r2.action==='confirm'){
                        const t1=new Date(r1.value).getTime();
                        const t2=new Date(r2.value).getTime();
                        const dayDiff=Math.round(Math.abs(t2-t1)/86400000);
                        await dialog.alert({message:`两个日期相差 ${dayDiff} 天`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展,可自行添加逻辑"});
                }
            }
        });
    }

    //1 饮食厨房50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:1,
            name:"厨房饮食"+(i+1),
            async handler(){
                if(i===0){
                    const res=await dialog.number({title:"大米克数",value:200,min:10,max:3000,decimals:0});
                    if(res.action==='confirm'){
                        const water=Math.round(res.value*1.2);
                        await dialog.alert({message:`煮饭参考\n米:${res.value} g\n建议加水:${water} g`});
                    }
                }else if(i===1){
                    const res=await dialog.number({title:"食材重量(g)",value:500,min:10,max:10000});
                    const resRate=await dialog.number({title:"腌制盐比例%",value:2,min:0.1,max:10,decimals:1});
                    if(res.action==='confirm'&&resRate.action==='confirm'){
                        const salt=res.value*resRate.value/100;
                        await dialog.alert({message:`腌制用盐量:${salt.toFixed(1)} g`});
                    }
                }else if(i===2){
                    const res=await dialog.number({title:"人数",value:3,min:1,max:20,decimals:0});
                    if(res.action==='confirm'){
                        const rice=res.value*120;
                        await dialog.alert({message:`${res.value}人做饭估算\n生米总重量约 ${rice} g`});
                    }
                }else if(i===3){
                    await dialog.alert({title:"食品安全提示",message:"熟食室温存放不要超过2小时;剩菜尽快冷藏,建议24小时吃完"});
                }else if(i===4){
                    const res=await dialog.number({title:"油温摄氏度",value:180,min:80,max:250,decimals:0});
                    if(res.action==='confirm'){
                        let tip="";
                        if(res.value<120)tip="低温,适合慢炸";
                        else if(res.value<180)tip="中温,煎鱼、煎肉";
                        else tip="高温,油炸,注意防溅油";
                        await dialog.alert({message:`${res.value}℃ ${tip}`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //2 运动健康50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:2,
            name:"运动健康"+(i+1),
            async handler(){
                if(i===0){
                    const h=await dialog.number({title:"身高(cm)",value:170,min:100,max:230,decimals:0});
                    const w=await dialog.number({title:"体重(kg)",value:65,min:20,max:300});
                    if(h.action==='confirm'&&w.action==='confirm'){
                        const bmi=w.value / ((h.value/100)*(h.value/100));
                        let level="";
                        if(bmi<18.5)level="偏瘦";
                        else if(bmi<24)level="正常";
                        else if(bmi<28)level="超重";
                        else level="肥胖";
                        await dialog.alert({message:`BMI=${bmi.toFixed(2)}\n评价:${level}\n仅供参考,不能替代医生诊断`});
                    }
                }else if(i===1){
                    const res=await dialog.number({title:"年龄",value:25,min:10,max:100,decimals:0});
                    if(res.action==='confirm'){
                        const maxHeart=220-res.value;
                        const low=Math.round(maxHeart*0.6);
                        const high=Math.round(maxHeart*0.8);
                        await dialog.alert({message:`运动心率参考\n最大心率≈${maxHeart}\n有氧区间:${low}-${high}`});
                    }
                }else if(i===2){
                    const res=await dialog.number({title:"步行步数",value:8000,min:0,max:200000,decimals:0});
                    if(res.action==='confirm'){
                        const km=(res.value*0.72/1000).toFixed(2);
                        const kcal=Math.round(res.value*0.04);
                        await dialog.alert({message:`步数${res.value}\n估算距离:${km} km\n估算消耗:${kcal} 千卡`});
                    }
                }else if(i===3){
                    await dialog.alert({title:"喝水提醒参考",message:"成年普通活动每日约1500‑2000ml;出汗多适当增加;肾病请遵从医嘱"});
                }else if(i===4){
                    const min=await dialog.number({title:"运动分钟",value:40,min:1,max:300,decimals:0});
                    if(min.action==='confirm'){
                        const cal=min.value*6;
                        await dialog.alert({message:`中等强度运动${min.value}分钟\n大约消耗 ${cal} 千卡(估算)`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //3 理财记账50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:3,
            name:"理财记账"+(i+1),
            async handler(){
                if(i===0){
                    const total=await dialog.number({title:"总金额",value:10000});
                    const month=await dialog.number({title:"计划月份",value:12,min:1,max:120,decimals:0});
                    if(total.action==='confirm'&&month.action==='confirm'){
                        const monthPay=(total.value/month.value).toFixed(2);
                        await dialog.alert({message:`分摊${month.value}个月\n每月≈ ${monthPay} 元`});
                    }
                }else if(i===1){
                    const price=await dialog.number({title:"原价",value:299});
                    const dis=await dialog.number({title:"折扣(0‑10)",value:8});
                    if(price.action==='confirm'&&dis.action==='confirm'){
                        const final=(price.value*dis.value/10).toFixed(2);
                        const save=(price.value-final).toFixed(2);
                        await dialog.alert({message:`原价${price.value} ${dis.value}折\n实付:${final}\n省:${save}`});
                    }
                }else if(i===2){
                    const salary=await dialog.number({title:"月收入",value:6000});
                    const saveRate=await dialog.number({title:"储蓄比例%",value:30,min:0,max:100});
                    if(salary.action==='confirm'&&saveRate.action==='confirm'){
                        const saveMoney=(salary.value*saveRate.value/100).toFixed(2);
                        await dialog.alert({message:`月收入${salary.value}\n每月存:${saveMoney}元`});
                    }
                }else if(i===3){
                    const a=await dialog.number({title:"A账单",value:240});
                    const b=await dialog.number({title:"B账单",value:360});
                    if(a.action==='confirm'&&b.action==='confirm'){
                        const avg=((a.value+b.value)/2).toFixed(2);
                        await dialog.alert({message:`AA合计:${a.value+b.value}\n每人应付 ${avg}`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //4 出行旅游50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:4,
            name:"出行旅游"+(i+1),
            async handler(){
                if(i===0){
                    const km=await dialog.number({title:"公里数",value:120});
                    const oil=await dialog.number({title:"油耗L/100km",value:7.5});
                    const oilPrice=await dialog.number({title:"油价元/L",value:7.5});
                    if(km.action==='confirm'&&oil.action==='confirm'&&oilPrice.action==='confirm'){
                        const liter=km.value*oil.value/100;
                        const cost=(liter*oilPrice.value).toFixed(2);
                        await dialog.alert({message:`${km.value}公里\n用油${liter.toFixed(2)}L\n油费${cost}元`});
                    }
                }else if(i===1){
                    const days=await dialog.number({title:"出行天数",value:5,min:1,max:60,decimals:0});
                    const per=await dialog.number({title:"每日预算",value:300});
                    if(days.action==='confirm'&&per.action==='confirm'){
                        await dialog.alert({message:`${days.value}天旅行总预算 ${days.value*per.value}元`});
                    }
                }else if(i===2){
                    await dialog.alert({title:"打包清单小提示",message:"证件、充电器、充电宝、换洗衣物、常用药、雨伞、口罩"});
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //5 学习办公50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:5,
            name:"学习办公"+(i+1),
            async handler(){
                if(i===0){
                    const totalScore=await dialog.number({title:"试卷满分",value:100});
                    const get=await dialog.number({title:"得分",value:82});
                    if(totalScore.action==='confirm'&&get.action==='confirm'){
                        const rate=(get.value/totalScore.value*100).toFixed(1);
                        await dialog.alert({message:`得分率 ${rate}%`});
                    }
                }else if(i===1){
                    const res=await dialog.number({title:"任务总数",value:12,min:1,max:200,decimals:0});
                    const done=await dialog.number({title:"已完成",value:5,min:0,max:200,decimals:0});
                    if(res.action==='confirm'&&done.action==='confirm'){
                        const pct=(done.value/res.value*100).toFixed(1);
                        await dialog.alert({message:`进度 ${done.value}/${res.value} = ${pct}%`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //6 作息计划50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:6,
            name:"作息计划"+(i+1),
            async handler(){
                if(i===0){
                    const sleepH=await dialog.number({title:"入睡小时",value:23,min:0,max:23,decimals:0});
                    const sleepM=await dialog.number({title:"入睡分钟",value:0,min:0,max:59,decimals:0});
                    const wakeH=await dialog.number({title:"起床小时",value:7,min:0,max:23,decimals:0});
                    const wakeM=await dialog.number({title:"起床分钟",value:30,min:0,max:59,decimals:0});
                    if(sleepH.action==='confirm'&&sleepM.action==='confirm'&&wakeH.action==='confirm'&&wakeM.action==='confirm'){
                        let s1=sleepH.value*60+sleepM.value;
                        let s2=wakeH.value*60+wakeM.value;
                        if(s2<s1)s2+=24*60;
                        const totalHour=((s2-s1)/60).toFixed(1);
                        await dialog.alert({message:`睡眠总时长 ${totalHour} 小时`});
                    }
                }else if(i===1){
                    await dialog.alert({title:"睡眠参考建议",message:"成年人推荐7‑9小时睡眠;青少年8‑10小时"});
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //7 购物消费50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:7,
            name:"购物消费"+(i+1),
            async handler(){
                if(i===0){
                    const priceA=await dialog.number({title:"商品A单价",value:19.9});
                    const numA=await dialog.number({title:"A数量",value:2,min:0,decimals:0});
                    const priceB=await dialog.number({title:"商品B单价",value:29.9});
                    const numB=await dialog.number({title:"B数量",value:1,min:0,decimals:0});
                    if(priceA.action==='confirm'&&numA.action==='confirm'&&priceB.action==='confirm'&&numB.action==='confirm'){
                        const sum=(priceA.value*numA.value+priceB.value*numB.value).toFixed(2);
                        await dialog.alert({message:`购物合计 ${sum} 元`});
                    }
                }else if(i===1){
                    const volume1=await dialog.number({title:"规格1容量",value:500});
                    const price1=await dialog.number({title:"规格1价格",value:12});
                    const volume2=await dialog.number({title:"规格2容量",value:1000});
                    const price2=await dialog.number({title:"规格2价格",value:20});
                    if(volume1.action==='confirm'&&price1.action==='confirm'&&volume2.action==='confirm'&&price2.action==='confirm'){
                        const u1=(price1.value/volume1.value*1000).toFixed(2);
                        const u2=(price2.value/volume2.value*1000).toFixed(2);
                        let tip=u1<u2?"规格1更划算":"规格2更划算";
                        await dialog.alert({message:`每1000单位价格\n规格1:${u1}\n规格2:${u2}\n${tip}`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //8 家庭家务50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:8,
            name:"家庭家务"+(i+1),
            async handler(){
                if(i===0){
                    const room=await dialog.number({title:"房间面积㎡",value:20,min:1,max:500});
                    const paintPer=await dialog.number({title:"每升涂刷㎡",value:8});
                    if(room.action==='confirm'&&paintPer.action==='confirm'){
                        const liter=(room.value/paintPer.value).toFixed(2);
                        await dialog.alert({message:`墙面估算需要油漆 ${liter} L`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //9 情感社交50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:9,
            name:"情感社交"+(i+1),
            async handler(){
                if(i===0){
                    const word=await dialog.text({title:"输入备忘短句",placeholder:"记录想说的话"});
                    if(word.action==='confirm'){
                        await script.data.set("social_note",word.value);
                        toast("已保存备忘");
                    }
                }else if(i===1){
                    const note=await script.data.get("social_note","无记录");
                    await dialog.alert({message:"保存备忘:\n"+note});
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //10 抽签趣味测试50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:10,
            name:"趣味抽签"+(i+1),
            async handler(){
                if(i===0){
                    const luck=["大吉","吉","中吉","小吉","平","小凶","凶","大凶"];
                    const rnd=luck[Math.floor(Math.random()*luck.length)];
                    await dialog.alert({title:"抽签结果",message:rnd+"\n仅供娱乐"});
                }else if(i===1){
                    const yesNo=["是","否","再想想看","或许吧","大概率是","大概率否"];
                    const res=yesNo[Math.floor(Math.random()*yesNo.length)];
                    await dialog.alert({title:"Yes/No占卜",message:res+"\n仅供娱乐"});
                }else if(i===2){
                    const res=await dialog.text({title:"输入选项逗号隔开",value:"吃饭,睡觉,逛街,看电影"});
                    if(res.action==='confirm'){
                        const arr=res.value.split(",");
                        const pick=arr[Math.floor(Math.random()*arr.length)];
                        await dialog.alert({message:"随机选中:"+pick});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"仅供娱乐,待扩展"});
                }
            }
        });
    }

    //11 单位换算50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:11,
            name:"单位换算"+(i+1),
            async handler(){
                if(i===0){
                    const cm=await dialog.number({title:"厘米",value:175});
                    if(cm.action==='confirm'){
                        const inch=(cm.value/2.54).toFixed(2);
                        await dialog.alert({message:`${cm.value} cm = ${inch} 英寸`});
                    }
                }else if(i===1){
                    const jin=await dialog.number({title:"斤",value:2});
                    if(jin.action==='confirm'){
                        const kg=(jin.value*0.5).toFixed(2);
                        await dialog.alert({message:`${jin.value}斤 = ${kg} kg`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //12文本笔记小工具50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:12,
            name:"文本笔记"+(i+1),
            async handler(){
                if(i===0){
                    const input=await dialog.text({title:"输入文字统计",placeholder:"粘贴文本"});
                    if(input.action==='confirm'){
                        const len=input.value.length;
                        const noSpace=input.value.replace(/\s/g,"").length;
                        await dialog.alert({message:`总字符${len},不含空格${noSpace}`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //13密码隐私安全50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:13,
            name:"安全密码"+(i+1),
            async handler(){
                if(i===0){
                    const len=await dialog.number({title:"密码长度",value:14,min:6,max:64,decimals:0});
                    if(len.action==='confirm'){
                        const pool="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&*";
                        let pwd="";
                        for(let j=0;j<len.value;j++) pwd+=pool[Math.floor(Math.random()*pool.length)];
                        await dialog.alert({message:"生成密码:\n"+pwd+"\n请妥善保管"});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //14收纳规划50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:14,
            name:"收纳规划"+(i+1),
            async handler(){
                if(i===0){
                    await dialog.alert({title:"收纳小建议",message:"常用物品放在随手可拿到位置;季节物品分类收纳,贴标签方便查找"});
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //15天气生活参考50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:15,
            name:"天气生活"+(i+1),
            async handler(){
                if(i===0){
                    const temp=await dialog.number({title:"温度℃",value:22});
                    if(temp.action==='confirm'){
                        let wear="";
                        if(temp.value>=28) wear="短袖短裤";
                        else if(temp.value>=22) wear="薄长袖";
                        else if(temp.value>=15) wear="薄外套";
                        else if(temp.value>=8) wear="厚外套";
                        else wear="厚羽绒服";
                        await dialog.alert({message:`${temp.value}℃穿衣参考:${wear}`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //16育儿生活50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:16,
            name:"育儿生活"+(i+1),
            async handler(){
                if(i===0){
                    const birthY=await dialog.number({title:"宝宝出生年",value:2025});
                    const birthM=await dialog.number({title:"宝宝出生月",value:3});
                    const birthD=await dialog.number({title:"宝宝出生日",value:10});
                    if(birthY.action==='confirm'&&birthM.action==='confirm'&&birthD.action==='confirm'){
                        const birth=new Date(birthY.value,birthM.value-1,birthD.value);
                        const now=new Date();
                        const diffMs=now-birth;
                        const day=Math.floor(diffMs/86400000);
                        const month=Math.floor(day/30.4375);
                        await dialog.alert({message:`宝宝出生距今\n天数:${day}天\n约 ${month} 个月`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"仅供参考,不能替代儿科医生建议"});
                }
            }
        });
    }

    //17节日农历简易50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:17,
            name:"节日农历"+(i+1),
            async handler(){
                if(i===0){
                    await dialog.alert({title:"公历节日备忘",message:"元旦1‑1;清明4月;劳动节5‑1;端午农历五月初五;中秋农历八月十五;国庆10‑1;春节农历正月初一"});
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //18随身简易计算50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:18,
            name:"随身计算"+(i+1),
            async handler(){
                if(i===0){
                    const a=await dialog.number({title:"数字A",value:0});
                    const b=await dialog.number({title:"数字B",value:0});
                    if(a.action==='confirm'&&b.action==='confirm'){
                        let divText=b.value===0?"除数为零":String((a.value/b.value).toFixed(4));
                        await dialog.alert({message:`A+B=${a.value+b.value}\nA-B=${a.value-b.value}\nA*B=${a.value*b.value}\nA/B=${divText}`});
                    }
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    //19杂项生活小工具50
    for(let i=0;i<50;i++){
        toolList.push({
            cat:19,
            name:"杂项工具"+(i+1),
            async handler(){
                if(i===0){
                    await dialog.alert({title:"防忘小技巧",message:"重要事情立刻简单记录;重复事项设置计时器提醒"});
                }else {
                    await dialog.alert({title:this.name,message:"待扩展"});
                }
            }
        });
    }

    let filterTools=[];
    function refreshFilter(){
        const catId=selectCategory.get();
        filterTools=toolList.filter(t=>t.cat===catId);
    }
    refreshFilter();

    const pageSize=20;

    function renderUi(){
        refreshFilter();
        const curPage=pageIndex.get();
        const totalPage=Math.ceil(filterTools.length/pageSize);
        const start=curPage*pageSize;
        const pageItems=filterTools.slice(start,start+pageSize);
        const gridArr=pageItems.map(x=>({text:x.name}));

        const catSelItems=categories.map(c=>({label:c.name,value:c.id}));
        return [
            ui.heading("生活全能工具箱1000项",{align:"center",lines:1}),
            ui.text(`分类:${categories[selectCategory.get()].name}  ${curPage+1}/${Math.max(totalPage,1)}页`,{align:"center"}),
            ui.spacer(8),
            ui.grid(gridArr,{columns:4,cellHeight:54}),
            ui.spacer(10),
            ui.buttonRow([
                {text:"上一页",id:"prev",disabled:curPage<=0,onPress:()=>pageIndex.update(v=>v-1)},
                {text:"下一页",id:"next",disabled:curPage>=totalPage-1,onPress:()=>pageIndex.update(v=>v+1)}
            ]),
            ui.spacer(8),
            ui.button("切换分类",async ()=>{
                const res=await dialog.select({title:"选择分类",items:catSelItems,value:selectCategory.get()});
                if(res.action==="confirm"){
                    selectCategory.set(res.value);
                    pageIndex.set(0);
                }
            },{id:"switchCat"}),
            ui.button("输入序号直接打开工具",async ()=>{
                const res=await dialog.number({title:"全局工具编号1‑1000",value:1,min:1,max:1000,decimals:0});
                if(res.action==='confirm'){
                    const idx=res.value-1;
                    if(idx>=0&&idx<toolList.length){
                        await toolList[idx].handler();
                    }else{
                        toast("编号超出范围");
                    }
                }
            },{id:"jumpTool"}),
            ui.spacer(12),
            ui.text("点击【输入序号直接打开工具】输入1‑1000,可快速调用任意工具。部分工具仅供生活参考,不能替代专业医生、财务意见。",{size:16,color:"#888888",lines:6})
        ];
    }

    ui.render(renderUi);
    pageIndex.subscribe(()=>ui.refresh());
    selectCategory.subscribe(()=>{
        pageIndex.set(0);
        ui.refresh();
    });
    toast("1000项生活工具箱加载完成");
}
return main();