500个源码仓库
http://wiki.75z29u.asia/arts/21172573.html
http://wiki.75z29u.asia/arts/95987230.html
http://wiki.75z29u.asia/arts/08323689.html
http://wiki.75z29u.asia/arts/85089804.html
http://wiki.75z29u.asia/arts/11714635.html
http://wiki.75z29u.asia/arts/13057660.html
http://wiki.75z29u.asia/arts/10595145.html
http://wiki.75z29u.asia/arts/97987412.html
http://wiki.75z29u.asia/arts/87805675.html
http://wiki.75z29u.asia/arts/39460869.html
http://wiki.75z29u.asia/arts/62071844.html
http://wiki.75z29u.asia/arts/20473966.html
http://wiki.75z29u.asia/arts/17582264.html
http://wiki.75z29u.asia/arts/22612593.html
http://wiki.75z29u.asia/arts/52342142.html
http://wiki.75z29u.asia/arts/96754128.html
http://wiki.75z29u.asia/arts/49429771.html
http://wiki.75z29u.asia/arts/54081172.html
http://wiki.75z29u.asia/arts/68137614.html
http://wiki.75z29u.asia/arts/18134447.html
http://wiki.75z29u.asia/arts/96889150.html
http://wiki.75z29u.asia/arts/65950437.html
http://wiki.75z29u.asia/arts/87620318.html
http://wiki.75z29u.asia/arts/75957996.html
http://wiki.75z29u.asia/arts/66582674.html
http://wiki.75z29u.asia/arts/51002623.html
http://wiki.75z29u.asia/arts/62733879.html
http://wiki.75z29u.asia/arts/69975320.html
http://wiki.75z29u.asia/arts/10241821.html
http://wiki.75z29u.asia/arts/44866311.html
http://wiki.75z29u.asia/arts/81546710.html
http://wiki.75z29u.asia/arts/29197396.html
http://wiki.75z29u.asia/arts/57082781.html
http://wiki.75z29u.asia/arts/89627793.html
http://wiki.75z29u.asia/arts/66616913.html
http://wiki.75z29u.asia/arts/65486199.html
http://wiki.75z29u.asia/arts/19851905.html
http://wiki.75z29u.asia/arts/19746633.html
http://wiki.75z29u.asia/arts/18623521.html
http://wiki.75z29u.asia/arts/04968194.html
http://wiki.75z29u.asia/arts/19492079.html
http://wiki.75z29u.asia/arts/67327012.html
http://wiki.75z29u.asia/arts/22718537.html
http://wiki.75z29u.asia/arts/57200218.html
http://wiki.75z29u.asia/arts/56720444.html
http://wiki.75z29u.asia/arts/06827747.html
http://wiki.75z29u.asia/arts/05480137.html
http://wiki.75z29u.asia/arts/10286800.html
http://wiki.75z29u.asia/arts/73552742.html
http://wiki.75z29u.asia/arts/78237057.html
http://wiki.75z29u.asia/arts/18044936.html
http://wiki.75z29u.asia/arts/69633401.html
http://wiki.75z29u.asia/arts/33581058.html
http://wiki.75z29u.asia/arts/30518573.html
http://wiki.75z29u.asia/arts/80618840.html
http://wiki.75z29u.asia/arts/62835716.html
http://wiki.75z29u.asia/arts/53008138.html
http://wiki.75z29u.asia/arts/04016603.html
http://wiki.75z29u.asia/arts/56621900.html
http://wiki.75z29u.asia/arts/41434774.html
http://wiki.75z29u.asia/arts/09537531.html
http://wiki.75z29u.asia/arts/47930438.html
http://wiki.75z29u.asia/arts/58610410.html
http://wiki.75z29u.asia/arts/54419776.html
http://wiki.75z29u.asia/arts/15240846.html
http://wiki.75z29u.asia/arts/58581107.html
http://wiki.75z29u.asia/arts/93643051.html
http://wiki.75z29u.asia/arts/68811341.html
http://wiki.75z29u.asia/arts/52620030.html
http://wiki.75z29u.asia/arts/39242441.html
http://wiki.75z29u.asia/arts/77013366.html
http://wiki.75z29u.asia/arts/21257679.html
http://wiki.75z29u.asia/arts/40273076.html
http://wiki.75z29u.asia/arts/96306306.html
http://wiki.75z29u.asia/arts/45592535.html
http://wiki.75z29u.asia/arts/08903114.html
http://wiki.75z29u.asia/arts/35019715.html
http://wiki.75z29u.asia/arts/45503424.html
http://wiki.75z29u.asia/arts/81020165.html
http://wiki.75z29u.asia/arts/20600026.html
http://wiki.75z29u.asia/arts/19615496.html
http://wiki.75z29u.asia/arts/23616302.html
http://wiki.75z29u.asia/arts/35339854.html
http://wiki.75z29u.asia/arts/97929946.html
http://wiki.75z29u.asia/arts/50073148.html
http://wiki.75z29u.asia/arts/70661258.html
http://wiki.75z29u.asia/arts/33179649.html
http://wiki.75z29u.asia/arts/18702611.html
http://wiki.75z29u.asia/arts/33086558.html
http://wiki.75z29u.asia/arts/42500616.html
http://wiki.75z29u.asia/arts/89951254.html
http://wiki.75z29u.asia/arts/58254945.html
http://wiki.75z29u.asia/arts/49870807.html
http://wiki.75z29u.asia/arts/77185226.html
http://wiki.75z29u.asia/arts/21529804.html
http://wiki.75z29u.asia/arts/96159442.html
http://wiki.75z29u.asia/arts/63874570.html
http://wiki.75z29u.asia/arts/86056267.html
http://wiki.75z29u.asia/arts/57928361.html
http://wiki.75z29u.asia/arts/44547398.html
http://wiki.75z29u.asia/arts/37493341.html
http://wiki.75z29u.asia/arts/58920383.html
http://wiki.75z29u.asia/arts/65891019.html
http://wiki.75z29u.asia/arts/24779777.html
http://wiki.75z29u.asia/arts/31419643.html
http://wiki.75z29u.asia/arts/23809986.html
http://wiki.75z29u.asia/arts/10797721.html
http://wiki.75z29u.asia/arts/61723607.html
http://wiki.75z29u.asia/arts/35476171.html
http://wiki.75z29u.asia/arts/47190467.html
http://wiki.75z29u.asia/arts/22791108.html
http://wiki.75z29u.asia/arts/01421566.html
http://wiki.75z29u.asia/arts/39914380.html
http://wiki.75z29u.asia/arts/51756636.html
http://wiki.75z29u.asia/arts/69226059.html
http://wiki.75z29u.asia/arts/12262882.html
http://wiki.75z29u.asia/arts/27476674.html
http://wiki.75z29u.asia/arts/23175239.html
http://wiki.75z29u.asia/arts/94395800.html
http://wiki.75z29u.asia/arts/60388500.html
http://wiki.75z29u.asia/arts/43833535.html
http://wiki.75z29u.asia/arts/72268763.html
http://wiki.75z29u.asia/arts/99219957.html
http://wiki.75z29u.asia/arts/99228190.html
http://wiki.75z29u.asia/arts/26735663.html
http://wiki.75z29u.asia/arts/30307268.html
http://wiki.75z29u.asia/arts/56536666.html
http://wiki.75z29u.asia/arts/73152735.html
http://wiki.75z29u.asia/arts/90163695.html
http://wiki.75z29u.asia/arts/66011903.html
http://wiki.75z29u.asia/arts/52768183.html
http://wiki.75z29u.asia/arts/28282882.html
http://wiki.75z29u.asia/arts/08976327.html
http://wiki.75z29u.asia/arts/86721864.html
http://wiki.75z29u.asia/arts/41068331.html
http://wiki.75z29u.asia/arts/50232990.html
http://wiki.75z29u.asia/arts/31854436.html
http://wiki.75z29u.asia/arts/73972553.html
http://wiki.75z29u.asia/arts/50268182.html
http://wiki.75z29u.asia/arts/87478871.html
http://wiki.75z29u.asia/arts/25577350.html
http://wiki.75z29u.asia/arts/94114659.html
http://wiki.75z29u.asia/arts/39209455.html
http://wiki.75z29u.asia/arts/04052583.html
http://wiki.75z29u.asia/arts/29599636.html
http://wiki.75z29u.asia/arts/75789863.html
http://wiki.75z29u.asia/arts/53045111.html
http://wiki.75z29u.asia/arts/19743458.html
http://wiki.75z29u.asia/arts/89884597.html
http://wiki.75z29u.asia/arts/77410443.html
http://wiki.75z29u.asia/arts/09773917.html
http://wiki.75z29u.asia/arts/24640669.html
http://wiki.75z29u.asia/arts/59758635.html
http://wiki.75z29u.asia/arts/74063300.html
http://wiki.75z29u.asia/arts/45896007.html
http://wiki.75z29u.asia/arts/86337237.html
http://wiki.75z29u.asia/arts/35107067.html
http://wiki.75z29u.asia/arts/37118163.html
http://wiki.75z29u.asia/arts/55061008.html
http://wiki.75z29u.asia/arts/22531383.html
http://wiki.75z29u.asia/arts/06406054.html
http://wiki.75z29u.asia/arts/95958769.html
http://wiki.75z29u.asia/arts/12913880.html
http://wiki.75z29u.asia/arts/45738325.html
http://wiki.75z29u.asia/arts/76034404.html
http://wiki.75z29u.asia/arts/80836579.html
http://wiki.75z29u.asia/arts/32411280.html
http://wiki.75z29u.asia/arts/70123833.html
http://wiki.75z29u.asia/arts/63927133.html
http://wiki.75z29u.asia/arts/87875454.html
http://wiki.75z29u.asia/arts/48404615.html
http://wiki.75z29u.asia/arts/51984773.html
http://wiki.75z29u.asia/arts/76992519.html
http://wiki.75z29u.asia/arts/10212655.html
http://wiki.75z29u.asia/arts/11851649.html
http://wiki.75z29u.asia/arts/67895651.html
http://wiki.75z29u.asia/arts/77065470.html
http://wiki.75z29u.asia/arts/69910284.html
http://wiki.75z29u.asia/arts/91162058.html
http://wiki.75z29u.asia/arts/05396661.html
http://wiki.75z29u.asia/arts/59701274.html
http://wiki.75z29u.asia/arts/60085138.html
http://wiki.75z29u.asia/arts/86865777.html
http://wiki.75z29u.asia/arts/87089048.html
http://wiki.75z29u.asia/arts/07960228.html
http://wiki.75z29u.asia/arts/64569661.html
http://wiki.75z29u.asia/arts/24018176.html
http://wiki.75z29u.asia/arts/71741115.html
http://wiki.75z29u.asia/arts/03825505.html
http://wiki.75z29u.asia/arts/95101202.html
http://wiki.75z29u.asia/arts/77872500.html
http://wiki.75z29u.asia/arts/15659860.html
http://wiki.75z29u.asia/arts/12565945.html
http://wiki.75z29u.asia/arts/34106537.html
http://wiki.75z29u.asia/arts/94799733.html
http://wiki.75z29u.asia/arts/52402803.html
http://wiki.75z29u.asia/arts/49636656.html
http://wiki.75z29u.asia/arts/58270691.html
http://wiki.75z29u.asia/arts/59925931.html
http://wiki.75z29u.asia/arts/43597669.html
http://wiki.75z29u.asia/arts/60599881.html
http://wiki.75z29u.asia/arts/21007178.html
http://wiki.75z29u.asia/arts/03851403.html
http://wiki.75z29u.asia/arts/61327115.html
http://wiki.75z29u.asia/arts/56699520.html
http://wiki.75z29u.asia/arts/35209625.html
http://wiki.75z29u.asia/arts/66301215.html
http://wiki.75z29u.asia/arts/73871298.html
http://wiki.75z29u.asia/arts/50178564.html
http://wiki.75z29u.asia/arts/64129400.html
http://wiki.75z29u.asia/arts/30412952.html
http://wiki.75z29u.asia/arts/29511033.html
http://wiki.75z29u.asia/arts/50783895.html
http://wiki.75z29u.asia/arts/19584312.html
http://wiki.75z29u.asia/arts/39653265.html
http://wiki.75z29u.asia/arts/21907455.html
http://wiki.75z29u.asia/arts/46489178.html
http://wiki.75z29u.asia/arts/10967527.html
http://wiki.75z29u.asia/arts/92982503.html
http://wiki.75z29u.asia/arts/47973908.html
http://wiki.75z29u.asia/arts/38617275.html
http://wiki.75z29u.asia/arts/17282057.html
http://wiki.75z29u.asia/arts/80864784.html
http://wiki.75z29u.asia/arts/66166719.html
http://wiki.75z29u.asia/arts/28524120.html
http://wiki.75z29u.asia/arts/76780518.html
http://wiki.75z29u.asia/arts/00287797.html
http://wiki.75z29u.asia/arts/19128470.html
http://wiki.75z29u.asia/arts/87268432.html
http://wiki.75z29u.asia/arts/87195416.html
http://wiki.75z29u.asia/arts/82145763.html
http://wiki.75z29u.asia/arts/48112642.html
http://wiki.75z29u.asia/arts/96273398.html
http://wiki.75z29u.asia/arts/15433304.html
http://wiki.75z29u.asia/arts/78972281.html
http://wiki.75z29u.asia/arts/69624678.html
http://wiki.75z29u.asia/arts/45658802.html
http://wiki.75z29u.asia/arts/88612423.html
http://wiki.75z29u.asia/arts/87909778.html
http://wiki.75z29u.asia/arts/63016420.html
http://wiki.75z29u.asia/arts/18276379.html
http://wiki.75z29u.asia/arts/78853823.html
http://wiki.75z29u.asia/arts/11439783.html
http://wiki.75z29u.asia/arts/59940579.html
http://wiki.75z29u.asia/arts/34534525.html
http://wiki.75z29u.asia/arts/01926778.html
http://wiki.75z29u.asia/arts/31035734.html
http://wiki.75z29u.asia/arts/81097278.html
http://wiki.75z29u.asia/arts/83913417.html
http://wiki.75z29u.asia/arts/57437396.html
http://wiki.75z29u.asia/arts/85177534.html
http://wiki.75z29u.asia/arts/62162269.html
http://wiki.75z29u.asia/arts/50954287.html
http://wiki.75z29u.asia/arts/44922340.html
http://wiki.75z29u.asia/arts/04612500.html
http://wiki.75z29u.asia/arts/25686812.html
http://wiki.75z29u.asia/arts/77218314.html
http://wiki.75z29u.asia/arts/66598982.html
http://wiki.75z29u.asia/arts/83431293.html
http://wiki.75z29u.asia/arts/77780742.html
http://wiki.75z29u.asia/arts/61843075.html
http://wiki.75z29u.asia/arts/36839489.html
http://wiki.75z29u.asia/arts/59007602.html
http://wiki.75z29u.asia/arts/47231601.html
http://wiki.75z29u.asia/arts/29562845.html
http://wiki.75z29u.asia/arts/87034294.html
http://wiki.75z29u.asia/arts/27454542.html
http://wiki.75z29u.asia/arts/59162941.html
http://wiki.75z29u.asia/arts/92449772.html
http://wiki.75z29u.asia/arts/50049957.html
http://wiki.75z29u.asia/arts/42652325.html
http://wiki.75z29u.asia/arts/62012586.html
http://wiki.75z29u.asia/arts/36188452.html
http://wiki.75z29u.asia/arts/78037568.html
http://wiki.75z29u.asia/arts/02088171.html
http://wiki.75z29u.asia/arts/52852290.html
http://wiki.75z29u.asia/arts/46333800.html
http://wiki.75z29u.asia/arts/66066858.html
http://wiki.75z29u.asia/arts/54069501.html
http://wiki.75z29u.asia/arts/65574853.html
http://wiki.75z29u.asia/arts/70128979.html
http://wiki.75z29u.asia/arts/11426073.html
http://wiki.75z29u.asia/arts/73633711.html
http://wiki.75z29u.asia/arts/26658647.html
http://wiki.75z29u.asia/arts/80325309.html
http://wiki.75z29u.asia/arts/17730522.html
http://wiki.75z29u.asia/arts/21137271.html
http://wiki.75z29u.asia/arts/61522699.html
http://wiki.75z29u.asia/arts/09209324.html
http://wiki.75z29u.asia/arts/19512825.html
http://wiki.75z29u.asia/arts/43565685.html
http://wiki.75z29u.asia/arts/86953542.html
http://wiki.75z29u.asia/arts/02356912.html
http://wiki.75z29u.asia/arts/58444265.html
http://wiki.75z29u.asia/arts/77932352.html
http://wiki.75z29u.asia/arts/54532152.html
http://wiki.75z29u.asia/arts/94283532.html
http://wiki.75z29u.asia/arts/98565861.html
http://wiki.75z29u.asia/arts/22513023.html
http://wiki.75z29u.asia/arts/20462743.html
http://wiki.75z29u.asia/arts/30299753.html
http://wiki.75z29u.asia/arts/95744586.html
http://wiki.75z29u.asia/arts/31241868.html
http://wiki.75z29u.asia/arts/49209606.html
http://wiki.75z29u.asia/arts/77052760.html
http://wiki.75z29u.asia/arts/38256429.html
http://wiki.75z29u.asia/arts/94197480.html
http://wiki.75z29u.asia/arts/31249496.html
http://wiki.75z29u.asia/arts/54264999.html
http://wiki.75z29u.asia/arts/91519466.html
http://wiki.75z29u.asia/arts/83665119.html
http://wiki.75z29u.asia/arts/03064360.html
http://wiki.75z29u.asia/arts/51914099.html
http://wiki.75z29u.asia/arts/95673833.html
http://wiki.75z29u.asia/arts/27209683.html
http://wiki.75z29u.asia/arts/22406100.html
http://wiki.75z29u.asia/arts/20326299.html
http://wiki.75z29u.asia/arts/91305225.html
http://wiki.75z29u.asia/arts/93529397.html
http://wiki.75z29u.asia/arts/93288848.html
http://wiki.75z29u.asia/arts/77668279.html
http://wiki.75z29u.asia/arts/47442063.html
http://wiki.75z29u.asia/arts/13397290.html
http://wiki.75z29u.asia/arts/54133192.html
http://wiki.75z29u.asia/arts/14692966.html
http://wiki.75z29u.asia/arts/44168535.html
http://wiki.75z29u.asia/arts/81213069.html
http://wiki.75z29u.asia/arts/76586343.html
http://wiki.75z29u.asia/arts/68365102.html
http://wiki.75z29u.asia/arts/87689737.html
http://wiki.75z29u.asia/arts/66565576.html
http://wiki.75z29u.asia/arts/06746903.html
http://wiki.75z29u.asia/arts/95365778.html
http://wiki.75z29u.asia/arts/20156013.html
http://wiki.75z29u.asia/arts/69543005.html
http://wiki.75z29u.asia/arts/36383006.html
http://wiki.75z29u.asia/arts/74675160.html
http://wiki.75z29u.asia/arts/44235088.html
http://wiki.75z29u.asia/arts/77781392.html
http://wiki.75z29u.asia/arts/08354864.html
http://wiki.75z29u.asia/arts/97257409.html
http://wiki.75z29u.asia/arts/93667004.html
http://wiki.75z29u.asia/arts/51971025.html
http://wiki.75z29u.asia/arts/02903576.html
http://wiki.75z29u.asia/arts/15055369.html
http://wiki.75z29u.asia/arts/92808233.html
http://wiki.75z29u.asia/arts/42917766.html
http://wiki.75z29u.asia/arts/49612456.html
http://wiki.75z29u.asia/arts/15517718.html
http://wiki.75z29u.asia/arts/35547492.html
http://wiki.75z29u.asia/arts/55124444.html
http://wiki.75z29u.asia/arts/30972528.html
http://wiki.75z29u.asia/arts/23602168.html
http://wiki.75z29u.asia/arts/41018481.html
http://wiki.75z29u.asia/arts/29363134.html
http://wiki.75z29u.asia/arts/49602754.html
http://wiki.75z29u.asia/arts/34719411.html
http://wiki.75z29u.asia/arts/22684259.html
http://wiki.75z29u.asia/arts/87908409.html
http://wiki.75z29u.asia/arts/41925232.html
http://wiki.75z29u.asia/arts/83387517.html
http://wiki.75z29u.asia/arts/64054176.html
http://wiki.75z29u.asia/arts/59109328.html
http://wiki.75z29u.asia/arts/34014894.html
http://wiki.75z29u.asia/arts/71750709.html
http://wiki.75z29u.asia/arts/55714146.html
http://wiki.75z29u.asia/arts/96113527.html
http://wiki.75z29u.asia/arts/61550352.html
http://wiki.75z29u.asia/arts/70725636.html
http://wiki.75z29u.asia/arts/49381957.html
http://wiki.75z29u.asia/arts/49890251.html
http://wiki.75z29u.asia/arts/70855228.html
http://wiki.75z29u.asia/arts/50825471.html
http://wiki.75z29u.asia/arts/18683290.html
http://wiki.75z29u.asia/arts/67965975.html
http://wiki.75z29u.asia/arts/14086456.html
http://wiki.75z29u.asia/arts/50206944.html
http://wiki.75z29u.asia/arts/28636241.html
http://wiki.75z29u.asia/arts/95035230.html
http://wiki.75z29u.asia/arts/84399192.html
http://wiki.75z29u.asia/arts/07921492.html
http://wiki.75z29u.asia/arts/48647556.html
http://wiki.75z29u.asia/arts/34438594.html
http://wiki.75z29u.asia/arts/96060905.html
http://wiki.75z29u.asia/arts/77154655.html
http://wiki.75z29u.asia/arts/69101123.html
http://wiki.75z29u.asia/arts/38924619.html
http://wiki.75z29u.asia/arts/16077666.html
http://wiki.75z29u.asia/arts/33306322.html
http://wiki.75z29u.asia/arts/93729838.html
http://wiki.75z29u.asia/arts/38770896.html
http://wiki.75z29u.asia/arts/58441739.html
http://wiki.75z29u.asia/arts/02053750.html
http://wiki.75z29u.asia/arts/29374992.html
http://wiki.75z29u.asia/arts/75644633.html
http://wiki.75z29u.asia/arts/31485094.html
http://wiki.75z29u.asia/arts/41822938.html
http://wiki.75z29u.asia/arts/88044240.html
http://wiki.75z29u.asia/arts/90169087.html
http://wiki.75z29u.asia/arts/37922448.html
http://wiki.75z29u.asia/arts/25731139.html
http://wiki.75z29u.asia/arts/10963493.html
http://wiki.75z29u.asia/arts/32314453.html
http://wiki.75z29u.asia/arts/59703831.html
http://wiki.75z29u.asia/arts/67842353.html
http://wiki.75z29u.asia/arts/94074901.html
http://wiki.75z29u.asia/arts/61738327.html
http://wiki.75z29u.asia/arts/70237670.html
http://wiki.75z29u.asia/arts/82365509.html
http://wiki.75z29u.asia/arts/53970892.html
http://wiki.75z29u.asia/arts/70651757.html
http://wiki.75z29u.asia/arts/26913893.html
http://wiki.75z29u.asia/arts/58354140.html
http://wiki.75z29u.asia/arts/43800707.html
http://wiki.75z29u.asia/arts/08515180.html
http://wiki.75z29u.asia/arts/20433315.html
http://wiki.75z29u.asia/arts/66049049.html
http://wiki.75z29u.asia/arts/85599348.html
http://wiki.75z29u.asia/arts/88655616.html
http://wiki.75z29u.asia/arts/85956893.html
http://wiki.75z29u.asia/arts/94647052.html
http://wiki.75z29u.asia/arts/41709003.html
http://wiki.75z29u.asia/arts/03709417.html
http://wiki.75z29u.asia/arts/48407454.html
http://wiki.75z29u.asia/arts/49046165.html
http://wiki.75z29u.asia/arts/11349100.html
http://wiki.75z29u.asia/arts/43662919.html
http://wiki.75z29u.asia/arts/03783971.html
http://wiki.75z29u.asia/arts/84616050.html
http://wiki.75z29u.asia/arts/43434523.html
http://wiki.75z29u.asia/arts/60043738.html
http://wiki.75z29u.asia/arts/85952070.html
http://wiki.75z29u.asia/arts/77413332.html
http://wiki.75z29u.asia/arts/21755934.html
http://wiki.75z29u.asia/arts/61860220.html
http://wiki.75z29u.asia/arts/13359699.html
http://wiki.75z29u.asia/arts/79109642.html
http://wiki.75z29u.asia/arts/97611050.html
http://wiki.75z29u.asia/arts/39977641.html
http://wiki.75z29u.asia/arts/01568358.html
http://wiki.75z29u.asia/arts/35880020.html
http://wiki.75z29u.asia/arts/34174426.html
http://wiki.75z29u.asia/arts/79481847.html
http://wiki.75z29u.asia/arts/31800507.html
http://wiki.75z29u.asia/arts/45522451.html
http://wiki.75z29u.asia/arts/66621953.html
http://wiki.75z29u.asia/arts/53930051.html
http://wiki.75z29u.asia/arts/34063475.html
http://wiki.75z29u.asia/arts/80317529.html
http://wiki.75z29u.asia/arts/88885460.html
http://wiki.75z29u.asia/arts/27475666.html
http://wiki.75z29u.asia/arts/48614591.html
http://wiki.75z29u.asia/arts/90926204.html
http://wiki.75z29u.asia/arts/66979221.html
http://wiki.75z29u.asia/arts/90728235.html
http://wiki.75z29u.asia/arts/77362941.html
http://wiki.75z29u.asia/arts/10596966.html
http://wiki.75z29u.asia/arts/63217230.html
http://wiki.75z29u.asia/arts/90409788.html
http://wiki.75z29u.asia/arts/42064289.html
http://wiki.75z29u.asia/arts/77003949.html
http://wiki.75z29u.asia/arts/14419633.html
http://wiki.75z29u.asia/arts/27807908.html
http://wiki.75z29u.asia/arts/67210115.html
http://wiki.75z29u.asia/arts/70067625.html
http://wiki.75z29u.asia/arts/36003700.html
http://wiki.75z29u.asia/arts/85672509.html
http://wiki.75z29u.asia/arts/37685095.html
http://wiki.75z29u.asia/arts/68933747.html
http://wiki.75z29u.asia/arts/07176017.html
http://wiki.75z29u.asia/arts/55559397.html
http://wiki.75z29u.asia/arts/64724271.html
http://wiki.75z29u.asia/arts/42147252.html
http://wiki.75z29u.asia/arts/10629267.html
http://wiki.75z29u.asia/arts/17280108.html
http://wiki.75z29u.asia/arts/95764025.html
http://wiki.75z29u.asia/arts/47559708.html
http://wiki.75z29u.asia/arts/83817295.html
http://wiki.75z29u.asia/arts/28908992.html
http://wiki.75z29u.asia/arts/16600633.html
http://wiki.75z29u.asia/arts/34939636.html
http://wiki.75z29u.asia/arts/84257364.html
http://wiki.75z29u.asia/arts/87535021.html
http://wiki.75z29u.asia/arts/23174274.html
http://wiki.75z29u.asia/arts/27302583.html
http://wiki.75z29u.asia/arts/96779399.html
http://wiki.75z29u.asia/arts/45801213.html
http://wiki.75z29u.asia/arts/35836869.html
http://wiki.75z29u.asia/arts/14846338.html
http://wiki.75z29u.asia/arts/87956486.html
http://wiki.75z29u.asia/arts/16322511.html
http://wiki.75z29u.asia/arts/62857199.html
http://wiki.75z29u.asia/arts/82531696.html
http://wiki.75z29u.asia/arts/39299016.html
http://wiki.75z29u.asia/arts/85267755.html
http://wiki.75z29u.asia/arts/53120122.html
http://wiki.75z29u.asia/arts/91483444.html
http://wiki.75z29u.asia/arts/26723252.html
http://wiki.75z29u.asia/arts/05201959.html
http://wiki.75z29u.asia/arts/48997826.html
http://wiki.75z29u.asia/arts/21172573.html
http://wiki.75z29u.asia/arts/95987230.html
http://wiki.75z29u.asia/arts/08323689.html
http://wiki.75z29u.asia/arts/85089804.html
http://wiki.75z29u.asia/arts/11714635.html
http://wiki.75z29u.asia/arts/13057660.html
http://wiki.75z29u.asia/arts/10595145.html
http://wiki.75z29u.asia/arts/97987412.html
http://wiki.75z29u.asia/arts/87805675.html
http://wiki.75z29u.asia/arts/39460869.html
http://wiki.75z29u.asia/arts/62071844.html
http://wiki.75z29u.asia/arts/20473966.html
http://wiki.75z29u.asia/arts/17582264.html
http://wiki.75z29u.asia/arts/22612593.html
http://wiki.75z29u.asia/arts/52342142.html
http://wiki.75z29u.asia/arts/96754128.html
http://wiki.75z29u.asia/arts/49429771.html
http://wiki.75z29u.asia/arts/54081172.html
http://wiki.75z29u.asia/arts/68137614.html
http://wiki.75z29u.asia/arts/18134447.html
http://wiki.75z29u.asia/arts/96889150.html
http://wiki.75z29u.asia/arts/65950437.html
http://wiki.75z29u.asia/arts/87620318.html
http://wiki.75z29u.asia/arts/75957996.html
http://wiki.75z29u.asia/arts/66582674.html
http://wiki.75z29u.asia/arts/51002623.html
http://wiki.75z29u.asia/arts/62733879.html
http://wiki.75z29u.asia/arts/69975320.html
http://wiki.75z29u.asia/arts/10241821.html
http://wiki.75z29u.asia/arts/44866311.html
http://wiki.75z29u.asia/arts/81546710.html
http://wiki.75z29u.asia/arts/29197396.html
http://wiki.75z29u.asia/arts/57082781.html
http://wiki.75z29u.asia/arts/89627793.html
http://wiki.75z29u.asia/arts/66616913.html
http://wiki.75z29u.asia/arts/65486199.html
http://wiki.75z29u.asia/arts/19851905.html
http://wiki.75z29u.asia/arts/19746633.html
http://wiki.75z29u.asia/arts/18623521.html
http://wiki.75z29u.asia/arts/04968194.html
http://wiki.75z29u.asia/arts/19492079.html
http://wiki.75z29u.asia/arts/67327012.html
http://wiki.75z29u.asia/arts/22718537.html
http://wiki.75z29u.asia/arts/57200218.html
http://wiki.75z29u.asia/arts/56720444.html
http://wiki.75z29u.asia/arts/06827747.html
http://wiki.75z29u.asia/arts/05480137.html
http://wiki.75z29u.asia/arts/10286800.html
http://wiki.75z29u.asia/arts/73552742.html
http://wiki.75z29u.asia/arts/78237057.html
http://wiki.75z29u.asia/arts/18044936.html
http://wiki.75z29u.asia/arts/69633401.html
http://wiki.75z29u.asia/arts/33581058.html
http://wiki.75z29u.asia/arts/30518573.html
http://wiki.75z29u.asia/arts/80618840.html
http://wiki.75z29u.asia/arts/62835716.html
http://wiki.75z29u.asia/arts/53008138.html
http://wiki.75z29u.asia/arts/04016603.html
http://wiki.75z29u.asia/arts/56621900.html
http://wiki.75z29u.asia/arts/41434774.html
http://wiki.75z29u.asia/arts/09537531.html
http://wiki.75z29u.asia/arts/47930438.html
http://wiki.75z29u.asia/arts/58610410.html
http://wiki.75z29u.asia/arts/54419776.html
http://wiki.75z29u.asia/arts/15240846.html
http://wiki.75z29u.asia/arts/58581107.html
http://wiki.75z29u.asia/arts/93643051.html
http://wiki.75z29u.asia/arts/68811341.html
http://wiki.75z29u.asia/arts/52620030.html
http://wiki.75z29u.asia/arts/39242441.html
http://wiki.75z29u.asia/arts/77013366.html
http://wiki.75z29u.asia/arts/21257679.html
http://wiki.75z29u.asia/arts/40273076.html
http://wiki.75z29u.asia/arts/96306306.html
http://wiki.75z29u.asia/arts/45592535.html
http://wiki.75z29u.asia/arts/08903114.html
http://wiki.75z29u.asia/arts/35019715.html
http://wiki.75z29u.asia/arts/45503424.html
http://wiki.75z29u.asia/arts/81020165.html
http://wiki.75z29u.asia/arts/20600026.html
http://wiki.75z29u.asia/arts/19615496.html
http://wiki.75z29u.asia/arts/23616302.html
http://wiki.75z29u.asia/arts/35339854.html
http://wiki.75z29u.asia/arts/97929946.html
http://wiki.75z29u.asia/arts/50073148.html
http://wiki.75z29u.asia/arts/70661258.html
http://wiki.75z29u.asia/arts/33179649.html
http://wiki.75z29u.asia/arts/18702611.html
http://wiki.75z29u.asia/arts/33086558.html
http://wiki.75z29u.asia/arts/42500616.html
http://wiki.75z29u.asia/arts/89951254.html
http://wiki.75z29u.asia/arts/58254945.html
http://wiki.75z29u.asia/arts/49870807.html
http://wiki.75z29u.asia/arts/77185226.html
http://wiki.75z29u.asia/arts/21529804.html
http://wiki.75z29u.asia/arts/96159442.html
http://wiki.75z29u.asia/arts/63874570.html
http://wiki.75z29u.asia/arts/86056267.html
http://wiki.75z29u.asia/arts/57928361.html
http://wiki.75z29u.asia/arts/44547398.html
http://wiki.75z29u.asia/arts/37493341.html
http://wiki.75z29u.asia/arts/58920383.html
http://wiki.75z29u.asia/arts/65891019.html
http://wiki.75z29u.asia/arts/24779777.html
http://wiki.75z29u.asia/arts/31419643.html
http://wiki.75z29u.asia/arts/23809986.html
http://wiki.75z29u.asia/arts/10797721.html
http://wiki.75z29u.asia/arts/61723607.html
http://wiki.75z29u.asia/arts/35476171.html
http://wiki.75z29u.asia/arts/47190467.html
http://wiki.75z29u.asia/arts/22791108.html
http://wiki.75z29u.asia/arts/01421566.html
http://wiki.75z29u.asia/arts/39914380.html
http://wiki.75z29u.asia/arts/51756636.html
http://wiki.75z29u.asia/arts/69226059.html
http://wiki.75z29u.asia/arts/12262882.html
http://wiki.75z29u.asia/arts/27476674.html
http://wiki.75z29u.asia/arts/23175239.html
http://wiki.75z29u.asia/arts/94395800.html
http://wiki.75z29u.asia/arts/60388500.html
http://wiki.75z29u.asia/arts/43833535.html
http://wiki.75z29u.asia/arts/72268763.html
http://wiki.75z29u.asia/arts/99219957.html
http://wiki.75z29u.asia/arts/99228190.html
http://wiki.75z29u.asia/arts/26735663.html
http://wiki.75z29u.asia/arts/30307268.html
http://wiki.75z29u.asia/arts/56536666.html
http://wiki.75z29u.asia/arts/73152735.html
http://wiki.75z29u.asia/arts/90163695.html
http://wiki.75z29u.asia/arts/66011903.html
http://wiki.75z29u.asia/arts/52768183.html
http://wiki.75z29u.asia/arts/28282882.html
http://wiki.75z29u.asia/arts/08976327.html
http://wiki.75z29u.asia/arts/86721864.html
http://wiki.75z29u.asia/arts/41068331.html
http://wiki.75z29u.asia/arts/50232990.html
http://wiki.75z29u.asia/arts/31854436.html
http://wiki.75z29u.asia/arts/73972553.html
http://wiki.75z29u.asia/arts/50268182.html
http://wiki.75z29u.asia/arts/87478871.html
http://wiki.75z29u.asia/arts/25577350.html
http://wiki.75z29u.asia/arts/94114659.html
http://wiki.75z29u.asia/arts/39209455.html
http://wiki.75z29u.asia/arts/04052583.html
http://wiki.75z29u.asia/arts/29599636.html
http://wiki.75z29u.asia/arts/75789863.html
http://wiki.75z29u.asia/arts/53045111.html
http://wiki.75z29u.asia/arts/19743458.html
http://wiki.75z29u.asia/arts/89884597.html
http://wiki.75z29u.asia/arts/77410443.html
http://wiki.75z29u.asia/arts/09773917.html
http://wiki.75z29u.asia/arts/24640669.html
http://wiki.75z29u.asia/arts/59758635.html
http://wiki.75z29u.asia/arts/74063300.html
http://wiki.75z29u.asia/arts/45896007.html
http://wiki.75z29u.asia/arts/86337237.html
http://wiki.75z29u.asia/arts/35107067.html
http://wiki.75z29u.asia/arts/37118163.html
http://wiki.75z29u.asia/arts/55061008.html
http://wiki.75z29u.asia/arts/22531383.html
http://wiki.75z29u.asia/arts/06406054.html
http://wiki.75z29u.asia/arts/95958769.html
http://wiki.75z29u.asia/arts/12913880.html
http://wiki.75z29u.asia/arts/45738325.html
http://wiki.75z29u.asia/arts/76034404.html
http://wiki.75z29u.asia/arts/80836579.html
http://wiki.75z29u.asia/arts/32411280.html
http://wiki.75z29u.asia/arts/70123833.html
http://wiki.75z29u.asia/arts/63927133.html
http://wiki.75z29u.asia/arts/87875454.html
http://wiki.75z29u.asia/arts/48404615.html
http://wiki.75z29u.asia/arts/51984773.html
http://wiki.75z29u.asia/arts/76992519.html
http://wiki.75z29u.asia/arts/10212655.html
http://wiki.75z29u.asia/arts/11851649.html
http://wiki.75z29u.asia/arts/67895651.html
http://wiki.75z29u.asia/arts/77065470.html
http://wiki.75z29u.asia/arts/69910284.html
http://wiki.75z29u.asia/arts/91162058.html
http://wiki.75z29u.asia/arts/05396661.html
http://wiki.75z29u.asia/arts/59701274.html
http://wiki.75z29u.asia/arts/60085138.html
http://wiki.75z29u.asia/arts/86865777.html
http://wiki.75z29u.asia/arts/87089048.html
http://wiki.75z29u.asia/arts/07960228.html
http://wiki.75z29u.asia/arts/64569661.html
http://wiki.75z29u.asia/arts/24018176.html
http://wiki.75z29u.asia/arts/71741115.html
http://wiki.75z29u.asia/arts/03825505.html
http://wiki.75z29u.asia/arts/95101202.html
http://wiki.75z29u.asia/arts/77872500.html
http://wiki.75z29u.asia/arts/15659860.html
http://wiki.75z29u.asia/arts/12565945.html
http://wiki.75z29u.asia/arts/34106537.html
http://wiki.75z29u.asia/arts/94799733.html
http://wiki.75z29u.asia/arts/52402803.html
http://wiki.75z29u.asia/arts/49636656.html
http://wiki.75z29u.asia/arts/58270691.html
http://wiki.75z29u.asia/arts/59925931.html
http://wiki.75z29u.asia/arts/43597669.html
http://wiki.75z29u.asia/arts/60599881.html
http://wiki.75z29u.asia/arts/21007178.html
http://wiki.75z29u.asia/arts/03851403.html
http://wiki.75z29u.asia/arts/61327115.html
http://wiki.75z29u.asia/arts/56699520.html
http://wiki.75z29u.asia/arts/35209625.html
http://wiki.75z29u.asia/arts/66301215.html
http://wiki.75z29u.asia/arts/73871298.html
http://wiki.75z29u.asia/arts/50178564.html
http://wiki.75z29u.asia/arts/64129400.html
http://wiki.75z29u.asia/arts/30412952.html
http://wiki.75z29u.asia/arts/29511033.html
http://wiki.75z29u.asia/arts/50783895.html
http://wiki.75z29u.asia/arts/19584312.html
http://wiki.75z29u.asia/arts/39653265.html
http://wiki.75z29u.asia/arts/21907455.html
http://wiki.75z29u.asia/arts/46489178.html
http://wiki.75z29u.asia/arts/10967527.html
http://wiki.75z29u.asia/arts/92982503.html
http://wiki.75z29u.asia/arts/47973908.html
http://wiki.75z29u.asia/arts/38617275.html
http://wiki.75z29u.asia/arts/17282057.html
http://wiki.75z29u.asia/arts/80864784.html
http://wiki.75z29u.asia/arts/66166719.html
http://wiki.75z29u.asia/arts/28524120.html
http://wiki.75z29u.asia/arts/76780518.html
http://wiki.75z29u.asia/arts/00287797.html
http://wiki.75z29u.asia/arts/19128470.html
http://wiki.75z29u.asia/arts/87268432.html
http://wiki.75z29u.asia/arts/87195416.html
http://wiki.75z29u.asia/arts/82145763.html
http://wiki.75z29u.asia/arts/48112642.html
http://wiki.75z29u.asia/arts/96273398.html
http://wiki.75z29u.asia/arts/15433304.html
http://wiki.75z29u.asia/arts/78972281.html
http://wiki.75z29u.asia/arts/69624678.html
http://wiki.75z29u.asia/arts/45658802.html
http://wiki.75z29u.asia/arts/88612423.html
http://wiki.75z29u.asia/arts/87909778.html
http://wiki.75z29u.asia/arts/63016420.html
http://wiki.75z29u.asia/arts/18276379.html
http://wiki.75z29u.asia/arts/78853823.html
http://wiki.75z29u.asia/arts/11439783.html
http://wiki.75z29u.asia/arts/59940579.html
http://wiki.75z29u.asia/arts/34534525.html
http://wiki.75z29u.asia/arts/01926778.html
http://wiki.75z29u.asia/arts/31035734.html
http://wiki.75z29u.asia/arts/81097278.html
http://wiki.75z29u.asia/arts/83913417.html
http://wiki.75z29u.asia/arts/57437396.html
http://wiki.75z29u.asia/arts/85177534.html
http://wiki.75z29u.asia/arts/62162269.html
http://wiki.75z29u.asia/arts/50954287.html
http://wiki.75z29u.asia/arts/44922340.html
http://wiki.75z29u.asia/arts/04612500.html
http://wiki.75z29u.asia/arts/25686812.html
http://wiki.75z29u.asia/arts/77218314.html
http://wiki.75z29u.asia/arts/66598982.html
http://wiki.75z29u.asia/arts/83431293.html
http://wiki.75z29u.asia/arts/77780742.html
http://wiki.75z29u.asia/arts/61843075.html
http://wiki.75z29u.asia/arts/36839489.html
http://wiki.75z29u.asia/arts/59007602.html
http://wiki.75z29u.asia/arts/47231601.html
http://wiki.75z29u.asia/arts/29562845.html
http://wiki.75z29u.asia/arts/87034294.html
http://wiki.75z29u.asia/arts/27454542.html
http://wiki.75z29u.asia/arts/59162941.html
http://wiki.75z29u.asia/arts/92449772.html
http://wiki.75z29u.asia/arts/50049957.html
http://wiki.75z29u.asia/arts/42652325.html
http://wiki.75z29u.asia/arts/62012586.html
http://wiki.75z29u.asia/arts/36188452.html
http://wiki.75z29u.asia/arts/78037568.html
http://wiki.75z29u.asia/arts/02088171.html
http://wiki.75z29u.asia/arts/52852290.html
http://wiki.75z29u.asia/arts/46333800.html
http://wiki.75z29u.asia/arts/66066858.html
http://wiki.75z29u.asia/arts/54069501.html
http://wiki.75z29u.asia/arts/65574853.html
http://wiki.75z29u.asia/arts/70128979.html
http://wiki.75z29u.asia/arts/11426073.html
http://wiki.75z29u.asia/arts/73633711.html
http://wiki.75z29u.asia/arts/26658647.html
http://wiki.75z29u.asia/arts/80325309.html
http://wiki.75z29u.asia/arts/17730522.html
http://wiki.75z29u.asia/arts/21137271.html
http://wiki.75z29u.asia/arts/61522699.html
http://wiki.75z29u.asia/arts/09209324.html
http://wiki.75z29u.asia/arts/19512825.html
http://wiki.75z29u.asia/arts/43565685.html
http://wiki.75z29u.asia/arts/86953542.html
http://wiki.75z29u.asia/arts/02356912.html
http://wiki.75z29u.asia/arts/58444265.html
http://wiki.75z29u.asia/arts/77932352.html
http://wiki.75z29u.asia/arts/54532152.html
http://wiki.75z29u.asia/arts/94283532.html
http://wiki.75z29u.asia/arts/98565861.html
http://wiki.75z29u.asia/arts/22513023.html
http://wiki.75z29u.asia/arts/20462743.html
http://wiki.75z29u.asia/arts/30299753.html
http://wiki.75z29u.asia/arts/95744586.html
http://wiki.75z29u.asia/arts/31241868.html
http://wiki.75z29u.asia/arts/49209606.html
http://wiki.75z29u.asia/arts/77052760.html
http://wiki.75z29u.asia/arts/38256429.html
http://wiki.75z29u.asia/arts/94197480.html
http://wiki.75z29u.asia/arts/31249496.html
http://wiki.75z29u.asia/arts/54264999.html
http://wiki.75z29u.asia/arts/91519466.html
http://wiki.75z29u.asia/arts/83665119.html
http://wiki.75z29u.asia/arts/03064360.html
http://wiki.75z29u.asia/arts/51914099.html
http://wiki.75z29u.asia/arts/95673833.html
http://wiki.75z29u.asia/arts/27209683.html
http://wiki.75z29u.asia/arts/22406100.html
http://wiki.75z29u.asia/arts/20326299.html
http://wiki.75z29u.asia/arts/91305225.html
http://wiki.75z29u.asia/arts/93529397.html
http://wiki.75z29u.asia/arts/93288848.html
http://wiki.75z29u.asia/arts/77668279.html
http://wiki.75z29u.asia/arts/47442063.html
http://wiki.75z29u.asia/arts/13397290.html
http://wiki.75z29u.asia/arts/54133192.html
http://wiki.75z29u.asia/arts/14692966.html
http://wiki.75z29u.asia/arts/44168535.html
http://wiki.75z29u.asia/arts/81213069.html
http://wiki.75z29u.asia/arts/76586343.html
http://wiki.75z29u.asia/arts/68365102.html
http://wiki.75z29u.asia/arts/87689737.html
http://wiki.75z29u.asia/arts/66565576.html
http://wiki.75z29u.asia/arts/06746903.html
http://wiki.75z29u.asia/arts/95365778.html
http://wiki.75z29u.asia/arts/20156013.html
http://wiki.75z29u.asia/arts/69543005.html
http://wiki.75z29u.asia/arts/36383006.html
http://wiki.75z29u.asia/arts/74675160.html
http://wiki.75z29u.asia/arts/44235088.html
http://wiki.75z29u.asia/arts/77781392.html
http://wiki.75z29u.asia/arts/08354864.html
http://wiki.75z29u.asia/arts/97257409.html
http://wiki.75z29u.asia/arts/93667004.html
http://wiki.75z29u.asia/arts/51971025.html
http://wiki.75z29u.asia/arts/02903576.html
http://wiki.75z29u.asia/arts/15055369.html
http://wiki.75z29u.asia/arts/92808233.html
http://wiki.75z29u.asia/arts/42917766.html
http://wiki.75z29u.asia/arts/49612456.html
http://wiki.75z29u.asia/arts/15517718.html
http://wiki.75z29u.asia/arts/35547492.html
http://wiki.75z29u.asia/arts/55124444.html
http://wiki.75z29u.asia/arts/30972528.html
http://wiki.75z29u.asia/arts/23602168.html
http://wiki.75z29u.asia/arts/41018481.html
http://wiki.75z29u.asia/arts/29363134.html
http://wiki.75z29u.asia/arts/49602754.html
http://wiki.75z29u.asia/arts/34719411.html
http://wiki.75z29u.asia/arts/22684259.html
http://wiki.75z29u.asia/arts/87908409.html
http://wiki.75z29u.asia/arts/41925232.html
http://wiki.75z29u.asia/arts/83387517.html
http://wiki.75z29u.asia/arts/64054176.html
http://wiki.75z29u.asia/arts/59109328.html
http://wiki.75z29u.asia/arts/34014894.html
http://wiki.75z29u.asia/arts/71750709.html
http://wiki.75z29u.asia/arts/55714146.html
http://wiki.75z29u.asia/arts/96113527.html
http://wiki.75z29u.asia/arts/61550352.html
http://wiki.75z29u.asia/arts/70725636.html
http://wiki.75z29u.asia/arts/49381957.html
http://wiki.75z29u.asia/arts/49890251.html
http://wiki.75z29u.asia/arts/70855228.html
http://wiki.75z29u.asia/arts/50825471.html
http://wiki.75z29u.asia/arts/18683290.html
http://wiki.75z29u.asia/arts/67965975.html
http://wiki.75z29u.asia/arts/14086456.html
http://wiki.75z29u.asia/arts/50206944.html
http://wiki.75z29u.asia/arts/28636241.html
http://wiki.75z29u.asia/arts/95035230.html
http://wiki.75z29u.asia/arts/84399192.html
http://wiki.75z29u.asia/arts/07921492.html
http://wiki.75z29u.asia/arts/48647556.html
http://wiki.75z29u.asia/arts/34438594.html
http://wiki.75z29u.asia/arts/96060905.html
http://wiki.75z29u.asia/arts/77154655.html
http://wiki.75z29u.asia/arts/69101123.html
http://wiki.75z29u.asia/arts/38924619.html
http://wiki.75z29u.asia/arts/16077666.html
http://wiki.75z29u.asia/arts/33306322.html
http://wiki.75z29u.asia/arts/93729838.html
http://wiki.75z29u.asia/arts/38770896.html
http://wiki.75z29u.asia/arts/58441739.html
http://wiki.75z29u.asia/arts/02053750.html
http://wiki.75z29u.asia/arts/29374992.html
http://wiki.75z29u.asia/arts/75644633.html
http://wiki.75z29u.asia/arts/31485094.html
http://wiki.75z29u.asia/arts/41822938.html
http://wiki.75z29u.asia/arts/88044240.html
http://wiki.75z29u.asia/arts/90169087.html
http://wiki.75z29u.asia/arts/37922448.html
http://wiki.75z29u.asia/arts/25731139.html
http://wiki.75z29u.asia/arts/10963493.html
http://wiki.75z29u.asia/arts/32314453.html
http://wiki.75z29u.asia/arts/59703831.html
http://wiki.75z29u.asia/arts/67842353.html
http://wiki.75z29u.asia/arts/94074901.html
http://wiki.75z29u.asia/arts/61738327.html
http://wiki.75z29u.asia/arts/70237670.html
http://wiki.75z29u.asia/arts/82365509.html
http://wiki.75z29u.asia/arts/53970892.html
http://wiki.75z29u.asia/arts/70651757.html
http://wiki.75z29u.asia/arts/26913893.html
http://wiki.75z29u.asia/arts/58354140.html
http://wiki.75z29u.asia/arts/43800707.html
http://wiki.75z29u.asia/arts/08515180.html
http://wiki.75z29u.asia/arts/20433315.html
http://wiki.75z29u.asia/arts/66049049.html
http://wiki.75z29u.asia/arts/85599348.html
http://wiki.75z29u.asia/arts/88655616.html
http://wiki.75z29u.asia/arts/85956893.html
http://wiki.75z29u.asia/arts/94647052.html
http://wiki.75z29u.asia/arts/41709003.html
http://wiki.75z29u.asia/arts/03709417.html
http://wiki.75z29u.asia/arts/48407454.html
http://wiki.75z29u.asia/arts/49046165.html
http://wiki.75z29u.asia/arts/11349100.html
http://wiki.75z29u.asia/arts/43662919.html
http://wiki.75z29u.asia/arts/03783971.html
http://wiki.75z29u.asia/arts/84616050.html
http://wiki.75z29u.asia/arts/43434523.html
http://wiki.75z29u.asia/arts/60043738.html
http://wiki.75z29u.asia/arts/85952070.html
http://wiki.75z29u.asia/arts/77413332.html
http://wiki.75z29u.asia/arts/21755934.html
http://wiki.75z29u.asia/arts/61860220.html
http://wiki.75z29u.asia/arts/13359699.html
http://wiki.75z29u.asia/arts/79109642.html
http://wiki.75z29u.asia/arts/97611050.html
http://wiki.75z29u.asia/arts/39977641.html
http://wiki.75z29u.asia/arts/01568358.html
http://wiki.75z29u.asia/arts/35880020.html
http://wiki.75z29u.asia/arts/34174426.html
http://wiki.75z29u.asia/arts/79481847.html
http://wiki.75z29u.asia/arts/31800507.html
http://wiki.75z29u.asia/arts/45522451.html
http://wiki.75z29u.asia/arts/66621953.html
http://wiki.75z29u.asia/arts/53930051.html
http://wiki.75z29u.asia/arts/34063475.html
http://wiki.75z29u.asia/arts/80317529.html
http://wiki.75z29u.asia/arts/88885460.html
http://wiki.75z29u.asia/arts/27475666.html
http://wiki.75z29u.asia/arts/48614591.html
http://wiki.75z29u.asia/arts/90926204.html
http://wiki.75z29u.asia/arts/66979221.html
http://wiki.75z29u.asia/arts/90728235.html
http://wiki.75z29u.asia/arts/77362941.html
http://wiki.75z29u.asia/arts/10596966.html
http://wiki.75z29u.asia/arts/63217230.html
http://wiki.75z29u.asia/arts/90409788.html
http://wiki.75z29u.asia/arts/42064289.html
http://wiki.75z29u.asia/arts/77003949.html
http://wiki.75z29u.asia/arts/14419633.html
http://wiki.75z29u.asia/arts/27807908.html
http://wiki.75z29u.asia/arts/67210115.html
http://wiki.75z29u.asia/arts/70067625.html
http://wiki.75z29u.asia/arts/36003700.html
http://wiki.75z29u.asia/arts/85672509.html
http://wiki.75z29u.asia/arts/37685095.html
http://wiki.75z29u.asia/arts/68933747.html
http://wiki.75z29u.asia/arts/07176017.html
http://wiki.75z29u.asia/arts/55559397.html
http://wiki.75z29u.asia/arts/64724271.html
http://wiki.75z29u.asia/arts/42147252.html
http://wiki.75z29u.asia/arts/10629267.html
http://wiki.75z29u.asia/arts/17280108.html
http://wiki.75z29u.asia/arts/95764025.html
http://wiki.75z29u.asia/arts/47559708.html
http://wiki.75z29u.asia/arts/83817295.html
http://wiki.75z29u.asia/arts/28908992.html
http://wiki.75z29u.asia/arts/16600633.html
http://wiki.75z29u.asia/arts/34939636.html
http://wiki.75z29u.asia/arts/84257364.html
http://wiki.75z29u.asia/arts/87535021.html
http://wiki.75z29u.asia/arts/23174274.html
http://wiki.75z29u.asia/arts/27302583.html
http://wiki.75z29u.asia/arts/96779399.html
http://wiki.75z29u.asia/arts/45801213.html
http://wiki.75z29u.asia/arts/35836869.html
http://wiki.75z29u.asia/arts/14846338.html
http://wiki.75z29u.asia/arts/87956486.html
http://wiki.75z29u.asia/arts/16322511.html
http://wiki.75z29u.asia/arts/62857199.html
http://wiki.75z29u.asia/arts/82531696.html
http://wiki.75z29u.asia/arts/39299016.html
http://wiki.75z29u.asia/arts/85267755.html
http://wiki.75z29u.asia/arts/53120122.html
http://wiki.75z29u.asia/arts/91483444.html
http://wiki.75z29u.asia/arts/26723252.html
http://wiki.75z29u.asia/arts/05201959.html
http://wiki.75z29u.asia/arts/48997826.html
100个实用工具大全
wiki.75z29u.asia/arts/29501155.html
wiki.75z29u.asia/arts/51854042.html
wiki.75z29u.asia/arts/63798124.html
wiki.75z29u.asia/arts/02008558.html
wiki.75z29u.asia/arts/56861414.html
wiki.75z29u.asia/arts/20180617.html
wiki.75z29u.asia/arts/95991745.html
wiki.75z29u.asia/arts/80341526.html
wiki.75z29u.asia/arts/14336963.html
wiki.75z29u.asia/arts/02171945.html
wiki.75z29u.asia/arts/45672777.html
wiki.75z29u.asia/arts/12039024.html
wiki.75z29u.asia/arts/27492705.html
wiki.75z29u.asia/arts/12125669.html
wiki.75z29u.asia/arts/19572473.html
wiki.75z29u.asia/arts/32613423.html
wiki.75z29u.asia/arts/21679198.html
wiki.75z29u.asia/arts/87554083.html
wiki.75z29u.asia/arts/82251391.html
wiki.75z29u.asia/arts/19778089.html
wiki.75z29u.asia/arts/46633887.html
wiki.75z29u.asia/arts/45753963.html
wiki.75z29u.asia/arts/68282801.html
wiki.75z29u.asia/arts/11040597.html
wiki.75z29u.asia/arts/97760319.html
wiki.75z29u.asia/arts/58354637.html
wiki.75z29u.asia/arts/17701205.html
wiki.75z29u.asia/arts/84447417.html
wiki.75z29u.asia/arts/98191006.html
wiki.75z29u.asia/arts/90963243.html
wiki.75z29u.asia/arts/52947517.html
wiki.75z29u.asia/arts/73903727.html
wiki.75z29u.asia/arts/78144377.html
wiki.75z29u.asia/arts/83669957.html
wiki.75z29u.asia/arts/41919461.html
wiki.75z29u.asia/arts/49386266.html
wiki.75z29u.asia/arts/05413486.html
wiki.75z29u.asia/arts/93898677.html
wiki.75z29u.asia/arts/60914015.html
wiki.75z29u.asia/arts/59020982.html
wiki.75z29u.asia/arts/28430255.html
wiki.75z29u.asia/arts/99432064.html
wiki.75z29u.asia/arts/20832995.html
wiki.75z29u.asia/arts/86427783.html
wiki.75z29u.asia/arts/35759587.html
wiki.75z29u.asia/arts/90073284.html
wiki.75z29u.asia/arts/40530242.html
wiki.75z29u.asia/arts/98452321.html
wiki.75z29u.asia/arts/73944122.html
wiki.75z29u.asia/arts/34844030.html
wiki.75z29u.asia/arts/45877579.html
wiki.75z29u.asia/arts/10802098.html
wiki.75z29u.asia/arts/67673577.html
wiki.75z29u.asia/arts/83112169.html
wiki.75z29u.asia/arts/54365456.html
wiki.75z29u.asia/arts/19429685.html
wiki.75z29u.asia/arts/76400490.html
wiki.75z29u.asia/arts/87824996.html
wiki.75z29u.asia/arts/19289051.html
wiki.75z29u.asia/arts/12904257.html
wiki.75z29u.asia/arts/04220656.html
wiki.75z29u.asia/arts/79835099.html
wiki.75z29u.asia/arts/82873069.html
wiki.75z29u.asia/arts/86276749.html
wiki.75z29u.asia/arts/67508131.html
wiki.75z29u.asia/arts/66702618.html
wiki.75z29u.asia/arts/09723396.html
wiki.75z29u.asia/arts/82713754.html
wiki.75z29u.asia/arts/36911053.html
wiki.75z29u.asia/arts/79041481.html
wiki.75z29u.asia/arts/78140893.html
wiki.75z29u.asia/arts/15838365.html
wiki.75z29u.asia/arts/88696520.html
wiki.75z29u.asia/arts/47548268.html
wiki.75z29u.asia/arts/44233987.html
wiki.75z29u.asia/arts/55331188.html
wiki.75z29u.asia/arts/40095757.html
wiki.75z29u.asia/arts/66194427.html
wiki.75z29u.asia/arts/62767391.html
wiki.75z29u.asia/arts/29104913.html
wiki.75z29u.asia/arts/14788467.html
wiki.75z29u.asia/arts/52841432.html
wiki.75z29u.asia/arts/78422093.html
wiki.75z29u.asia/arts/59120766.html
wiki.75z29u.asia/arts/48846590.html
wiki.75z29u.asia/arts/12900774.html
wiki.75z29u.asia/arts/62496238.html
wiki.75z29u.asia/arts/99833568.html
wiki.75z29u.asia/arts/62463509.html
wiki.75z29u.asia/arts/03219671.html
wiki.75z29u.asia/arts/44484792.html
wiki.75z29u.asia/arts/57838924.html
wiki.75z29u.asia/arts/08940003.html
wiki.75z29u.asia/arts/07942476.html
wiki.75z29u.asia/arts/25036289.html
wiki.75z29u.asia/arts/64976424.html
wiki.75z29u.asia/arts/85846171.html
wiki.75z29u.asia/arts/76176310.html
wiki.75z29u.asia/arts/91689044.html
wiki.75z29u.asia/arts/28298150.html
wiki.lgr7yk.asia/arts/87506426.html
wiki.lgr7yk.asia/arts/62949748.html
wiki.lgr7yk.asia/arts/11815275.html
wiki.lgr7yk.asia/arts/83671547.html
wiki.lgr7yk.asia/arts/08725341.html
wiki.lgr7yk.asia/arts/42348262.html
wiki.lgr7yk.asia/arts/00457049.html
wiki.lgr7yk.asia/arts/45813293.html
wiki.lgr7yk.asia/arts/88999086.html
wiki.lgr7yk.asia/arts/34433904.html
wiki.lgr7yk.asia/arts/26316191.html
wiki.lgr7yk.asia/arts/62584203.html
wiki.lgr7yk.asia/arts/51302701.html
wiki.lgr7yk.asia/arts/50998280.html
wiki.lgr7yk.asia/arts/51749923.html
wiki.lgr7yk.asia/arts/65616275.html
wiki.lgr7yk.asia/arts/24475760.html
wiki.lgr7yk.asia/arts/20433941.html
wiki.lgr7yk.asia/arts/63436717.html
wiki.lgr7yk.asia/arts/68699113.html
wiki.lgr7yk.asia/arts/94056614.html
wiki.lgr7yk.asia/arts/12626192.html
wiki.lgr7yk.asia/arts/94578881.html
wiki.lgr7yk.asia/arts/75154305.html
wiki.lgr7yk.asia/arts/45982924.html
wiki.lgr7yk.asia/arts/73254398.html
wiki.lgr7yk.asia/arts/18589912.html
wiki.lgr7yk.asia/arts/59046255.html
wiki.lgr7yk.asia/arts/39231516.html
wiki.lgr7yk.asia/arts/40510359.html
wiki.lgr7yk.asia/arts/11149109.html
wiki.lgr7yk.asia/arts/11916780.html
wiki.lgr7yk.asia/arts/74264915.html
wiki.lgr7yk.asia/arts/43379997.html
wiki.lgr7yk.asia/arts/23670186.html
wiki.lgr7yk.asia/arts/06248556.html
wiki.lgr7yk.asia/arts/35518004.html
wiki.lgr7yk.asia/arts/69719042.html
wiki.lgr7yk.asia/arts/20634234.html
wiki.lgr7yk.asia/arts/78004444.html
wiki.lgr7yk.asia/arts/95357011.html
wiki.lgr7yk.asia/arts/63709731.html
wiki.lgr7yk.asia/arts/56142087.html
wiki.lgr7yk.asia/arts/13570044.html
wiki.lgr7yk.asia/arts/34774378.html
wiki.lgr7yk.asia/arts/38695547.html
wiki.lgr7yk.asia/arts/16660433.html
wiki.lgr7yk.asia/arts/65374479.html
wiki.lgr7yk.asia/arts/94269226.html
wiki.lgr7yk.asia/arts/14273234.html
wiki.lgr7yk.asia/arts/05977544.html
wiki.lgr7yk.asia/arts/56367308.html
wiki.lgr7yk.asia/arts/39491479.html
wiki.lgr7yk.asia/arts/69933409.html
wiki.lgr7yk.asia/arts/58279603.html
wiki.lgr7yk.asia/arts/42513973.html
wiki.lgr7yk.asia/arts/98244674.html
wiki.lgr7yk.asia/arts/48130787.html
wiki.lgr7yk.asia/arts/41839137.html
wiki.lgr7yk.asia/arts/60845206.html
wiki.lgr7yk.asia/arts/82334192.html
wiki.lgr7yk.asia/arts/67102361.html
wiki.lgr7yk.asia/arts/88007661.html
wiki.lgr7yk.asia/arts/73316933.html
wiki.lgr7yk.asia/arts/15972103.html
wiki.lgr7yk.asia/arts/46509384.html
wiki.lgr7yk.asia/arts/53596536.html
wiki.lgr7yk.asia/arts/25636359.html
wiki.lgr7yk.asia/arts/74787370.html
wiki.lgr7yk.asia/arts/60270618.html
wiki.lgr7yk.asia/arts/15934826.html
wiki.lgr7yk.asia/arts/95867462.html
wiki.lgr7yk.asia/arts/02535252.html
wiki.lgr7yk.asia/arts/38895754.html
wiki.lgr7yk.asia/arts/55525274.html
wiki.lgr7yk.asia/arts/19351581.html
wiki.lgr7yk.asia/arts/11891787.html
wiki.lgr7yk.asia/arts/12856515.html
wiki.lgr7yk.asia/arts/72529288.html
wiki.lgr7yk.asia/arts/29674146.html
wiki.lgr7yk.asia/arts/81039559.html
wiki.lgr7yk.asia/arts/81122080.html
wiki.lgr7yk.asia/arts/96097428.html
wiki.lgr7yk.asia/arts/39569582.html
wiki.lgr7yk.asia/arts/51419620.html
wiki.lgr7yk.asia/arts/01086704.html
wiki.lgr7yk.asia/arts/67213365.html
wiki.lgr7yk.asia/arts/23865575.html
wiki.lgr7yk.asia/arts/39077107.html
wiki.lgr7yk.asia/arts/45333203.html
wiki.lgr7yk.asia/arts/69225606.html
wiki.lgr7yk.asia/arts/12987050.html
wiki.lgr7yk.asia/arts/38940837.html
wiki.lgr7yk.asia/arts/71436959.html
wiki.lgr7yk.asia/arts/12523517.html
wiki.lgr7yk.asia/arts/35631577.html
wiki.lgr7yk.asia/arts/88579918.html
wiki.lgr7yk.asia/arts/64713834.html
wiki.lgr7yk.asia/arts/87485050.html
wiki.lgr7yk.asia/arts/15104905.html
wiki.75z29u.asia/arts/29501155.html
wiki.75z29u.asia/arts/51854042.html
wiki.75z29u.asia/arts/63798124.html
wiki.75z29u.asia/arts/02008558.html
wiki.75z29u.asia/arts/56861414.html
wiki.75z29u.asia/arts/20180617.html
wiki.75z29u.asia/arts/95991745.html
wiki.75z29u.asia/arts/80341526.html
wiki.75z29u.asia/arts/14336963.html
wiki.75z29u.asia/arts/02171945.html
wiki.75z29u.asia/arts/45672777.html
wiki.75z29u.asia/arts/12039024.html
wiki.75z29u.asia/arts/27492705.html
wiki.75z29u.asia/arts/12125669.html
wiki.75z29u.asia/arts/19572473.html
wiki.75z29u.asia/arts/32613423.html
wiki.75z29u.asia/arts/21679198.html
wiki.75z29u.asia/arts/87554083.html
wiki.75z29u.asia/arts/82251391.html
wiki.75z29u.asia/arts/19778089.html
wiki.75z29u.asia/arts/46633887.html
wiki.75z29u.asia/arts/45753963.html
wiki.75z29u.asia/arts/68282801.html
wiki.75z29u.asia/arts/11040597.html
wiki.75z29u.asia/arts/97760319.html
wiki.75z29u.asia/arts/58354637.html
wiki.75z29u.asia/arts/17701205.html
wiki.75z29u.asia/arts/84447417.html
wiki.75z29u.asia/arts/98191006.html
wiki.75z29u.asia/arts/90963243.html
wiki.75z29u.asia/arts/52947517.html
wiki.75z29u.asia/arts/73903727.html
wiki.75z29u.asia/arts/78144377.html
wiki.75z29u.asia/arts/83669957.html
wiki.75z29u.asia/arts/41919461.html
wiki.75z29u.asia/arts/49386266.html
wiki.75z29u.asia/arts/05413486.html
wiki.75z29u.asia/arts/93898677.html
wiki.75z29u.asia/arts/60914015.html
wiki.75z29u.asia/arts/59020982.html
wiki.75z29u.asia/arts/28430255.html
wiki.75z29u.asia/arts/99432064.html
wiki.75z29u.asia/arts/20832995.html
wiki.75z29u.asia/arts/86427783.html
wiki.75z29u.asia/arts/35759587.html
wiki.75z29u.asia/arts/90073284.html
wiki.75z29u.asia/arts/40530242.html
wiki.75z29u.asia/arts/98452321.html
wiki.75z29u.asia/arts/73944122.html
wiki.75z29u.asia/arts/34844030.html
wiki.75z29u.asia/arts/45877579.html
wiki.75z29u.asia/arts/10802098.html
wiki.75z29u.asia/arts/67673577.html
wiki.75z29u.asia/arts/83112169.html
wiki.75z29u.asia/arts/54365456.html
wiki.75z29u.asia/arts/19429685.html
wiki.75z29u.asia/arts/76400490.html
wiki.75z29u.asia/arts/87824996.html
wiki.75z29u.asia/arts/19289051.html
wiki.75z29u.asia/arts/12904257.html
wiki.75z29u.asia/arts/04220656.html
wiki.75z29u.asia/arts/79835099.html
wiki.75z29u.asia/arts/82873069.html
wiki.75z29u.asia/arts/86276749.html
wiki.75z29u.asia/arts/67508131.html
wiki.75z29u.asia/arts/66702618.html
wiki.75z29u.asia/arts/09723396.html
wiki.75z29u.asia/arts/82713754.html
wiki.75z29u.asia/arts/36911053.html
wiki.75z29u.asia/arts/79041481.html
wiki.75z29u.asia/arts/78140893.html
wiki.75z29u.asia/arts/15838365.html
wiki.75z29u.asia/arts/88696520.html
wiki.75z29u.asia/arts/47548268.html
wiki.75z29u.asia/arts/44233987.html
wiki.75z29u.asia/arts/55331188.html
wiki.75z29u.asia/arts/40095757.html
wiki.75z29u.asia/arts/66194427.html
wiki.75z29u.asia/arts/62767391.html
wiki.75z29u.asia/arts/29104913.html
wiki.75z29u.asia/arts/14788467.html
wiki.75z29u.asia/arts/52841432.html
wiki.75z29u.asia/arts/78422093.html
wiki.75z29u.asia/arts/59120766.html
wiki.75z29u.asia/arts/48846590.html
wiki.75z29u.asia/arts/12900774.html
wiki.75z29u.asia/arts/62496238.html
wiki.75z29u.asia/arts/99833568.html
wiki.75z29u.asia/arts/62463509.html
wiki.75z29u.asia/arts/03219671.html
wiki.75z29u.asia/arts/44484792.html
wiki.75z29u.asia/arts/57838924.html
wiki.75z29u.asia/arts/08940003.html
wiki.75z29u.asia/arts/07942476.html
wiki.75z29u.asia/arts/25036289.html
wiki.75z29u.asia/arts/64976424.html
wiki.75z29u.asia/arts/85846171.html
wiki.75z29u.asia/arts/76176310.html
wiki.75z29u.asia/arts/91689044.html
wiki.75z29u.asia/arts/28298150.html
wiki.lgr7yk.asia/arts/87506426.html
wiki.lgr7yk.asia/arts/62949748.html
wiki.lgr7yk.asia/arts/11815275.html
wiki.lgr7yk.asia/arts/83671547.html
wiki.lgr7yk.asia/arts/08725341.html
wiki.lgr7yk.asia/arts/42348262.html
wiki.lgr7yk.asia/arts/00457049.html
wiki.lgr7yk.asia/arts/45813293.html
wiki.lgr7yk.asia/arts/88999086.html
wiki.lgr7yk.asia/arts/34433904.html
wiki.lgr7yk.asia/arts/26316191.html
wiki.lgr7yk.asia/arts/62584203.html
wiki.lgr7yk.asia/arts/51302701.html
wiki.lgr7yk.asia/arts/50998280.html
wiki.lgr7yk.asia/arts/51749923.html
wiki.lgr7yk.asia/arts/65616275.html
wiki.lgr7yk.asia/arts/24475760.html
wiki.lgr7yk.asia/arts/20433941.html
wiki.lgr7yk.asia/arts/63436717.html
wiki.lgr7yk.asia/arts/68699113.html
wiki.lgr7yk.asia/arts/94056614.html
wiki.lgr7yk.asia/arts/12626192.html
wiki.lgr7yk.asia/arts/94578881.html
wiki.lgr7yk.asia/arts/75154305.html
wiki.lgr7yk.asia/arts/45982924.html
wiki.lgr7yk.asia/arts/73254398.html
wiki.lgr7yk.asia/arts/18589912.html
wiki.lgr7yk.asia/arts/59046255.html
wiki.lgr7yk.asia/arts/39231516.html
wiki.lgr7yk.asia/arts/40510359.html
wiki.lgr7yk.asia/arts/11149109.html
wiki.lgr7yk.asia/arts/11916780.html
wiki.lgr7yk.asia/arts/74264915.html
wiki.lgr7yk.asia/arts/43379997.html
wiki.lgr7yk.asia/arts/23670186.html
wiki.lgr7yk.asia/arts/06248556.html
wiki.lgr7yk.asia/arts/35518004.html
wiki.lgr7yk.asia/arts/69719042.html
wiki.lgr7yk.asia/arts/20634234.html
wiki.lgr7yk.asia/arts/78004444.html
wiki.lgr7yk.asia/arts/95357011.html
wiki.lgr7yk.asia/arts/63709731.html
wiki.lgr7yk.asia/arts/56142087.html
wiki.lgr7yk.asia/arts/13570044.html
wiki.lgr7yk.asia/arts/34774378.html
wiki.lgr7yk.asia/arts/38695547.html
wiki.lgr7yk.asia/arts/16660433.html
wiki.lgr7yk.asia/arts/65374479.html
wiki.lgr7yk.asia/arts/94269226.html
wiki.lgr7yk.asia/arts/14273234.html
wiki.lgr7yk.asia/arts/05977544.html
wiki.lgr7yk.asia/arts/56367308.html
wiki.lgr7yk.asia/arts/39491479.html
wiki.lgr7yk.asia/arts/69933409.html
wiki.lgr7yk.asia/arts/58279603.html
wiki.lgr7yk.asia/arts/42513973.html
wiki.lgr7yk.asia/arts/98244674.html
wiki.lgr7yk.asia/arts/48130787.html
wiki.lgr7yk.asia/arts/41839137.html
wiki.lgr7yk.asia/arts/60845206.html
wiki.lgr7yk.asia/arts/82334192.html
wiki.lgr7yk.asia/arts/67102361.html
wiki.lgr7yk.asia/arts/88007661.html
wiki.lgr7yk.asia/arts/73316933.html
wiki.lgr7yk.asia/arts/15972103.html
wiki.lgr7yk.asia/arts/46509384.html
wiki.lgr7yk.asia/arts/53596536.html
wiki.lgr7yk.asia/arts/25636359.html
wiki.lgr7yk.asia/arts/74787370.html
wiki.lgr7yk.asia/arts/60270618.html
wiki.lgr7yk.asia/arts/15934826.html
wiki.lgr7yk.asia/arts/95867462.html
wiki.lgr7yk.asia/arts/02535252.html
wiki.lgr7yk.asia/arts/38895754.html
wiki.lgr7yk.asia/arts/55525274.html
wiki.lgr7yk.asia/arts/19351581.html
wiki.lgr7yk.asia/arts/11891787.html
wiki.lgr7yk.asia/arts/12856515.html
wiki.lgr7yk.asia/arts/72529288.html
wiki.lgr7yk.asia/arts/29674146.html
wiki.lgr7yk.asia/arts/81039559.html
wiki.lgr7yk.asia/arts/81122080.html
wiki.lgr7yk.asia/arts/96097428.html
wiki.lgr7yk.asia/arts/39569582.html
wiki.lgr7yk.asia/arts/51419620.html
wiki.lgr7yk.asia/arts/01086704.html
wiki.lgr7yk.asia/arts/67213365.html
wiki.lgr7yk.asia/arts/23865575.html
wiki.lgr7yk.asia/arts/39077107.html
wiki.lgr7yk.asia/arts/45333203.html
wiki.lgr7yk.asia/arts/69225606.html
wiki.lgr7yk.asia/arts/12987050.html
wiki.lgr7yk.asia/arts/38940837.html
wiki.lgr7yk.asia/arts/71436959.html
wiki.lgr7yk.asia/arts/12523517.html
wiki.lgr7yk.asia/arts/35631577.html
wiki.lgr7yk.asia/arts/88579918.html
wiki.lgr7yk.asia/arts/64713834.html
wiki.lgr7yk.asia/arts/87485050.html
wiki.lgr7yk.asia/arts/15104905.html
解决不同路由页面存在相同组件id导致组件无法获焦的问题
问题现象
页面一使用requestFocus通过组件id获焦成功,然后路由至页面二,再然后路由至页面一,此时为什么无法使用requestFocus通过组件id获焦?
主页代码示例参考如下:
// 主页
@Entry
@Component
struct NavigationIndex {
@Provide('pathInfos') pathInfos: NavPathStack = new NavPathStack();
private listArray: string[] = ['WLAN', 'Connect & Share'];
build() {
Column() {
Navigation(this.pathInfos) {
TextInput({ placeholder: '输入关键字搜索' })
.width('90%')
.height(40)
.margin({ bottom: 10 });
// 通过List定义导航的一级界面
List({ space: 12, initialIndex: 0 }) {
ForEach(this.listArray, (item: string) => {
ListItem() {
Row() {
Row() {
Text(${item.slice(0, 1)})
.fontColor(Color.White)
.fontSize(14)
.fontWeight(FontWeight.Bold);
}
.width(30)
.height(30)
.backgroundColor('#a8a8a8')
.margin({ right: 20 })
.borderRadius(20)
.justifyContent(FlexAlign.Center);
Column() {
Text(item)
.fontSize(16)
.margin({ bottom: 5 });
}
.alignItems(HorizontalAlign.Start);
Blank();
Row()
.width(12)
.height(12)
.margin({ right: 15 })
.border({
width: { top: 2, right: 2 },
color: 0xcccccc
})
.rotate({ angle: 45 });
}
.borderRadius(15)
.shadow({ radius: 100, color: '#ededed' })
.width('90%')
.alignItems(VerticalAlign.Center)
.padding({ left: 15, top: 15, bottom: 15 })
.backgroundColor(Color.White);
}
.width('100%')
.onClick(() => {
this.pathInfos.pushPathByName(`${item}`, '');
});
}, (item: string): string => item);
}
.listDirection(Axis.Vertical)
.edgeEffect(EdgeEffect.Spring)
.sticky(StickyStyle.Header)
.chainAnimation(false)
.width('100%');
}
.width('100%')
.mode(NavigationMode.Auto)
.title('设置'); // 设置标题文字
}
.size({ width: '100%', height: '100%' })
.backgroundColor(0xf4f4f5);
}
}
页面一代码示例参考如下:
// 页面一
@Builder
export function PageOneBuilder(name: string) {
PageOne({ name: name });
}
@Component
struct PageOne {
pathInfos: NavPathStack = new NavPathStack();
name: string = '';
@State isShow: boolean = false;
@Builder
textBuilder(id: string) {
TextInput()
.width('90%')
.id(id)
.onSubmit(() => {
this.isShow = true;
})
.onAppear(() => {
try {
this.getUIContext().getFocusController().requestFocus(id);
console.info(Succeeded in appearing component. name: ${this.name}, id ${id}.);
} catch (e) {
console.error(Failed to appear component. code: ${e.code}, message: ${e.message});
}
});
}
build() {
NavDestination() {
Column({ space: 24 }) {
this.textBuilder(${this.name}1);
if (this.isShow) {
this.textBuilder(${this.name}2);
}
Button('next')
.width('50%')
.height(40)
.margin({ top: 50 })
.onClick(() => {
// 弹出路由栈栈顶元素,跳转'Connect & Share'页面
this.pathInfos.pushPathByName(Connect & Share, '');
});
}
.size({ width: '100%', height: '100%' });
}
.title(${this.name})
.onReady((ctx: NavDestinationContext) => {
// NavDestinationContext获取当前所在的导航控制器
this.pathInfos = ctx.pathStack;
})
.onShown(() => {
this.isShow = false;
});
}
}
页面二跳转页面一代码示例参考如下:
// 页面二
@Builder
export function PageTwoBuilder(name: string) {
PageTwo({ name: name });
}
@Component
struct PageTwo {
pathInfos: NavPathStack = new NavPathStack();
name: string = '';
@State isShow: boolean = false;
build() {
NavDestination() {
Column({ space: 5 }) {
Button('next')
.width('50%')
.height(40)
.margin({ top: 5 })
.onClick(() => {
// 跳转到WLAN
this.pathInfos.pushPath({ name: 'WLAN', param: '' });
});
}
.size({ width: '100%', height: '100%' });
}
.title(${this.name})
.onReady((ctx: NavDestinationContext) => {
// NavDestinationContext获取当前所在的导航控制器
this.pathInfos = ctx.pathStack;
})
.onShown(() => {
this.isShow = false;
});
}
}
背景知识
Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏。其中NavPathStack导航控制器提供多种跳转方式,具体参考LaunchMode。
组件标识(id)为组件的唯一标识,在整个应用内唯一。
问题定位
当由页面一路由至页面二后,页面二重新路由至页面一,传参保持不变,组件最后id为“WLAN1”和“WLAN2”,与路由栈内存在的页面一组件id一致,因此id赋值失败,requestFocus找不到对应组件。报错信息如下:
Error code: 150003, Error message: The component doesn't exist, is currently invisible, or has been disabled.
分析结论
路由栈内存在已有同id组件,因此新页面组件id赋值失败,requestFocus找不到对应组件。
修改建议
路由逻辑:主页跳转页面一,页面一跳转页面二,页面二跳转页面一。
方案一:消除同id组件。
方式一:页面一跳转页面二时,跳转方法使用replacePathByName,用新页面替换旧组件所在页面。
// 弹出路由栈栈顶元素,跳转'Connect & Share'页面
this.pathInfos.replacePathByName(Connect & Share, '详情页面参数');
方式二:页面二跳转页面一时,跳转模式MOVE_TO_TOP_SINGLETON或者POP_TO_SINGLETON,使用原页面。
// 跳转到WLAN
this.pathInfos.pushPath({ name: 'WLAN', param: '' }, { launchMode: LaunchMode.MOVE_TO_TOP_SINGLETON });
方案二:使用新的组件id。
根据页面传入的不同数据,重新命名id。name参数或者param参数均可,如下例子为name参数。
主页跳转页面一:
this.pathInfos.pushPathByName('WLAN', '');
页面二跳转页面一:
this.pathInfos.pushPathByName('Bluetooth', '');
路由表router_map.json如下:
{
"routerMap": [
{
"name": "WLAN",
"pageSourceFile": "src/main/ets/pages/ProblemPage.ets",
"buildFunction": "PageOneBuilder"
},
{
"name": "Bluetooth",
"pageSourceFile": "src/main/ets/pages/ProblemPage.ets",
"buildFunction": "PageOneBuilder"
},
{
"name": "Connect & Share",
"pageSourceFile": "src/main/ets/pages/ProblemPage.ets",
"buildFunction": "PageTwoBuilder"
}
]
}
常见FAQ
Q:使用HMRouter三方库进行页面跳转是否也有上述问题?
A:有上述问题。HMRouter三方库是基于Navigation实现的。
Q:为什么使用replace没有出现上述问题?
A:本质原因是路由栈中只有一个页面一,因此无重复使用同一id问题。首先页面一跳转页面二使用replace,此情况下栈中只存在页面二,下次跳转页面一后,栈中只有一个页面一。其次页面二跳转页面一使用MOVE_TO_TOP_SINGLETON或者POP_TO_SINGLETON跳转模式,此模式为单例跳转,跳转后栈中只存在一个页面一。
总结
id为组件的唯一标识,在整个应用内唯一。其他组件不可使用已命名的id,同时id命名以最新的id为准。
https://coub.com/view/9tjqrj50va
https://coub.com/view/rb2xb8a4n5
https://coub.com/view/5b79yniyth
https://coub.com/view/wamid4rm21
https://coub.com/view/zaw8d5yz2e
https://coub.com/view/zniccr5gwr
https://coub.com/view/3399xuazi1
https://coub.com/view/lsrnrbztyl
https://coub.com/view/x1m7lryfzq
https://coub.com/view/37xic534xp
https://coub.com/view/e4ot7q9l4a
https://coub.com/view/7xfg675fke
https://coub.com/view/cd5uv7n8di
https://coub.com/view/2yftocq9eo
https://coub.com/view/iz8k9vdeoq
https://coub.com/view/ss942ngulq
https://coub.com/view/0otxz11rt6
https://coub.com/view/t380otx63g
https://coub.com/view/s5jv5wwpp8
https://coub.com/view/uqzz8yd5t0
https://coub.com/view/v5mqk9pi4b
https://coub.com/view/3x24yjjngs
https://coub.com/view/bgr3qxu81y
https://coub.com/view/aczggz0c7l
https://coub.com/view/19x48j87yh
https://coub.com/view/mhj9o7akb8
https://coub.com/view/t52hno1jvx
https://coub.com/view/xd692lkh1w
https://coub.com/view/45f8w8eqt6
https://coub.com/view/7ufkfov20r
https://coub.com/view/aracs9rxr1
https://coub.com/view/usxdnvf69s
https://coub.com/view/xn4zgcqewo
https://coub.com/view/feshuj117i
https://coub.com/view/bo1naj1hg3
https://coub.com/view/0ooh9cdel4
https://coub.com/view/3r5m3lecc0
https://coub.com/view/u0e1fs4r10
https://coub.com/view/im9tfsm0vb
https://coub.com/view/xn9sc0dl48
https://coub.com/view/okd6f44ahj
https://coub.com/view/2ul6cv24s5
https://coub.com/view/2wiiaa2m0v
https://coub.com/view/kdm5dqnfm9
https://coub.com/view/v0mkw3fy9q
https://coub.com/view/xf417qh06w
https://coub.com/view/p7o9bdx3hd
https://coub.com/view/a4c7cs4za4
https://coub.com/view/2m9q5l3tye
https://coub.com/view/l5wijck89c
https://coub.com/view/7uv550mvcv
https://coub.com/view/hinzf3owe6
https://coub.com/view/2xs4q3hodd
https://coub.com/view/z2sz46ny5w
https://coub.com/view/fnxtc5jxkn
https://coub.com/view/idp6ix7wa7
https://coub.com/view/143z08ound
https://coub.com/view/xh81ng97rv
https://coub.com/view/b6idbpkjwm
https://coub.com/view/japbulumr8
https://coub.com/view/lzxbq7ueb8
https://coub.com/view/rykuydlgya
https://coub.com/view/g0bcawp1uo
https://coub.com/view/2dha0vzzq9
https://coub.com/view/nnbmf46ubp
https://coub.com/view/k4bl2myg5o
https://coub.com/view/tw1cs9daax
https://coub.com/view/w6k3awnqf7
https://coub.com/view/ufi6kkw1pn
https://coub.com/view/smcemgyolt
https://coub.com/view/n7zx8jkeqx
https://coub.com/view/zejw3zqzj9
https://coub.com/view/3yb82a6rzb
https://coub.com/view/2yfowuwqug
https://coub.com/view/d71yoe6vki
https://coub.com/view/qtoldx6o14
https://coub.com/view/ww8hn3f0ng
https://coub.com/view/m01ucwuhs9
https://coub.com/view/hjur00uu7a
https://coub.com/view/hxqok76tx8
问题现象
页面一使用requestFocus通过组件id获焦成功,然后路由至页面二,再然后路由至页面一,此时为什么无法使用requestFocus通过组件id获焦?
主页代码示例参考如下:
// 主页
@Entry
@Component
struct NavigationIndex {
@Provide('pathInfos') pathInfos: NavPathStack = new NavPathStack();
private listArray: string[] = ['WLAN', 'Connect & Share'];
build() {
Column() {
Navigation(this.pathInfos) {
TextInput({ placeholder: '输入关键字搜索' })
.width('90%')
.height(40)
.margin({ bottom: 10 });
// 通过List定义导航的一级界面
List({ space: 12, initialIndex: 0 }) {
ForEach(this.listArray, (item: string) => {
ListItem() {
Row() {
Row() {
Text(${item.slice(0, 1)})
.fontColor(Color.White)
.fontSize(14)
.fontWeight(FontWeight.Bold);
}
.width(30)
.height(30)
.backgroundColor('#a8a8a8')
.margin({ right: 20 })
.borderRadius(20)
.justifyContent(FlexAlign.Center);
Column() {
Text(item)
.fontSize(16)
.margin({ bottom: 5 });
}
.alignItems(HorizontalAlign.Start);
Blank();
Row()
.width(12)
.height(12)
.margin({ right: 15 })
.border({
width: { top: 2, right: 2 },
color: 0xcccccc
})
.rotate({ angle: 45 });
}
.borderRadius(15)
.shadow({ radius: 100, color: '#ededed' })
.width('90%')
.alignItems(VerticalAlign.Center)
.padding({ left: 15, top: 15, bottom: 15 })
.backgroundColor(Color.White);
}
.width('100%')
.onClick(() => {
this.pathInfos.pushPathByName(`${item}`, '');
});
}, (item: string): string => item);
}
.listDirection(Axis.Vertical)
.edgeEffect(EdgeEffect.Spring)
.sticky(StickyStyle.Header)
.chainAnimation(false)
.width('100%');
}
.width('100%')
.mode(NavigationMode.Auto)
.title('设置'); // 设置标题文字
}
.size({ width: '100%', height: '100%' })
.backgroundColor(0xf4f4f5);
}
}
页面一代码示例参考如下:
// 页面一
@Builder
export function PageOneBuilder(name: string) {
PageOne({ name: name });
}
@Component
struct PageOne {
pathInfos: NavPathStack = new NavPathStack();
name: string = '';
@State isShow: boolean = false;
@Builder
textBuilder(id: string) {
TextInput()
.width('90%')
.id(id)
.onSubmit(() => {
this.isShow = true;
})
.onAppear(() => {
try {
this.getUIContext().getFocusController().requestFocus(id);
console.info(Succeeded in appearing component. name: ${this.name}, id ${id}.);
} catch (e) {
console.error(Failed to appear component. code: ${e.code}, message: ${e.message});
}
});
}
build() {
NavDestination() {
Column({ space: 24 }) {
this.textBuilder(${this.name}1);
if (this.isShow) {
this.textBuilder(${this.name}2);
}
Button('next')
.width('50%')
.height(40)
.margin({ top: 50 })
.onClick(() => {
// 弹出路由栈栈顶元素,跳转'Connect & Share'页面
this.pathInfos.pushPathByName(Connect & Share, '');
});
}
.size({ width: '100%', height: '100%' });
}
.title(${this.name})
.onReady((ctx: NavDestinationContext) => {
// NavDestinationContext获取当前所在的导航控制器
this.pathInfos = ctx.pathStack;
})
.onShown(() => {
this.isShow = false;
});
}
}
页面二跳转页面一代码示例参考如下:
// 页面二
@Builder
export function PageTwoBuilder(name: string) {
PageTwo({ name: name });
}
@Component
struct PageTwo {
pathInfos: NavPathStack = new NavPathStack();
name: string = '';
@State isShow: boolean = false;
build() {
NavDestination() {
Column({ space: 5 }) {
Button('next')
.width('50%')
.height(40)
.margin({ top: 5 })
.onClick(() => {
// 跳转到WLAN
this.pathInfos.pushPath({ name: 'WLAN', param: '' });
});
}
.size({ width: '100%', height: '100%' });
}
.title(${this.name})
.onReady((ctx: NavDestinationContext) => {
// NavDestinationContext获取当前所在的导航控制器
this.pathInfos = ctx.pathStack;
})
.onShown(() => {
this.isShow = false;
});
}
}
背景知识
Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏。其中NavPathStack导航控制器提供多种跳转方式,具体参考LaunchMode。
组件标识(id)为组件的唯一标识,在整个应用内唯一。
问题定位
当由页面一路由至页面二后,页面二重新路由至页面一,传参保持不变,组件最后id为“WLAN1”和“WLAN2”,与路由栈内存在的页面一组件id一致,因此id赋值失败,requestFocus找不到对应组件。报错信息如下:
Error code: 150003, Error message: The component doesn't exist, is currently invisible, or has been disabled.
分析结论
路由栈内存在已有同id组件,因此新页面组件id赋值失败,requestFocus找不到对应组件。
修改建议
路由逻辑:主页跳转页面一,页面一跳转页面二,页面二跳转页面一。
方案一:消除同id组件。
方式一:页面一跳转页面二时,跳转方法使用replacePathByName,用新页面替换旧组件所在页面。
// 弹出路由栈栈顶元素,跳转'Connect & Share'页面
this.pathInfos.replacePathByName(Connect & Share, '详情页面参数');
方式二:页面二跳转页面一时,跳转模式MOVE_TO_TOP_SINGLETON或者POP_TO_SINGLETON,使用原页面。
// 跳转到WLAN
this.pathInfos.pushPath({ name: 'WLAN', param: '' }, { launchMode: LaunchMode.MOVE_TO_TOP_SINGLETON });
方案二:使用新的组件id。
根据页面传入的不同数据,重新命名id。name参数或者param参数均可,如下例子为name参数。
主页跳转页面一:
this.pathInfos.pushPathByName('WLAN', '');
页面二跳转页面一:
this.pathInfos.pushPathByName('Bluetooth', '');
路由表router_map.json如下:
{
"routerMap": [
{
"name": "WLAN",
"pageSourceFile": "src/main/ets/pages/ProblemPage.ets",
"buildFunction": "PageOneBuilder"
},
{
"name": "Bluetooth",
"pageSourceFile": "src/main/ets/pages/ProblemPage.ets",
"buildFunction": "PageOneBuilder"
},
{
"name": "Connect & Share",
"pageSourceFile": "src/main/ets/pages/ProblemPage.ets",
"buildFunction": "PageTwoBuilder"
}
]
}
常见FAQ
Q:使用HMRouter三方库进行页面跳转是否也有上述问题?
A:有上述问题。HMRouter三方库是基于Navigation实现的。
Q:为什么使用replace没有出现上述问题?
A:本质原因是路由栈中只有一个页面一,因此无重复使用同一id问题。首先页面一跳转页面二使用replace,此情况下栈中只存在页面二,下次跳转页面一后,栈中只有一个页面一。其次页面二跳转页面一使用MOVE_TO_TOP_SINGLETON或者POP_TO_SINGLETON跳转模式,此模式为单例跳转,跳转后栈中只存在一个页面一。
总结
id为组件的唯一标识,在整个应用内唯一。其他组件不可使用已命名的id,同时id命名以最新的id为准。
https://coub.com/view/9tjqrj50va
https://coub.com/view/rb2xb8a4n5
https://coub.com/view/5b79yniyth
https://coub.com/view/wamid4rm21
https://coub.com/view/zaw8d5yz2e
https://coub.com/view/zniccr5gwr
https://coub.com/view/3399xuazi1
https://coub.com/view/lsrnrbztyl
https://coub.com/view/x1m7lryfzq
https://coub.com/view/37xic534xp
https://coub.com/view/e4ot7q9l4a
https://coub.com/view/7xfg675fke
https://coub.com/view/cd5uv7n8di
https://coub.com/view/2yftocq9eo
https://coub.com/view/iz8k9vdeoq
https://coub.com/view/ss942ngulq
https://coub.com/view/0otxz11rt6
https://coub.com/view/t380otx63g
https://coub.com/view/s5jv5wwpp8
https://coub.com/view/uqzz8yd5t0
https://coub.com/view/v5mqk9pi4b
https://coub.com/view/3x24yjjngs
https://coub.com/view/bgr3qxu81y
https://coub.com/view/aczggz0c7l
https://coub.com/view/19x48j87yh
https://coub.com/view/mhj9o7akb8
https://coub.com/view/t52hno1jvx
https://coub.com/view/xd692lkh1w
https://coub.com/view/45f8w8eqt6
https://coub.com/view/7ufkfov20r
https://coub.com/view/aracs9rxr1
https://coub.com/view/usxdnvf69s
https://coub.com/view/xn4zgcqewo
https://coub.com/view/feshuj117i
https://coub.com/view/bo1naj1hg3
https://coub.com/view/0ooh9cdel4
https://coub.com/view/3r5m3lecc0
https://coub.com/view/u0e1fs4r10
https://coub.com/view/im9tfsm0vb
https://coub.com/view/xn9sc0dl48
https://coub.com/view/okd6f44ahj
https://coub.com/view/2ul6cv24s5
https://coub.com/view/2wiiaa2m0v
https://coub.com/view/kdm5dqnfm9
https://coub.com/view/v0mkw3fy9q
https://coub.com/view/xf417qh06w
https://coub.com/view/p7o9bdx3hd
https://coub.com/view/a4c7cs4za4
https://coub.com/view/2m9q5l3tye
https://coub.com/view/l5wijck89c
https://coub.com/view/7uv550mvcv
https://coub.com/view/hinzf3owe6
https://coub.com/view/2xs4q3hodd
https://coub.com/view/z2sz46ny5w
https://coub.com/view/fnxtc5jxkn
https://coub.com/view/idp6ix7wa7
https://coub.com/view/143z08ound
https://coub.com/view/xh81ng97rv
https://coub.com/view/b6idbpkjwm
https://coub.com/view/japbulumr8
https://coub.com/view/lzxbq7ueb8
https://coub.com/view/rykuydlgya
https://coub.com/view/g0bcawp1uo
https://coub.com/view/2dha0vzzq9
https://coub.com/view/nnbmf46ubp
https://coub.com/view/k4bl2myg5o
https://coub.com/view/tw1cs9daax
https://coub.com/view/w6k3awnqf7
https://coub.com/view/ufi6kkw1pn
https://coub.com/view/smcemgyolt
https://coub.com/view/n7zx8jkeqx
https://coub.com/view/zejw3zqzj9
https://coub.com/view/3yb82a6rzb
https://coub.com/view/2yfowuwqug
https://coub.com/view/d71yoe6vki
https://coub.com/view/qtoldx6o14
https://coub.com/view/ww8hn3f0ng
https://coub.com/view/m01ucwuhs9
https://coub.com/view/hjur00uu7a
https://coub.com/view/hxqok76tx8
大家做美颜接入时,遇到最多的问题是什么?
有在项目里接入过相芯美颜的朋友吗?想和大家交流一下实际使用体验,比如效果自然程度、设备兼容性,以及接入时遇到的问题。
个人觉得,美颜不一定要把参数拉满,保留一些皮肤质感、根据场景适当调整,画面会更耐看。
代码部分也可以把参数管理单独封装起来,界面负责调节,底层负责转换参数并调用 SDK,后续维护会方便一些。
另外,因为我这边买了一个包,有需要的同学可以一起用,支持月付、季付、年付,可以根据项目周期选择。有需求的话,先沟通使用平台、功能和授权范围,再确认是否适合。
有接入经验的朋友欢迎留言交流,需要了解插件的也可以联系我。
微信:【she195519】
添加时备注“相芯美颜”即可。
// 自定义界面参数,统一使用 0~100
const beautyOptions = {
smooth: 30, // 磨皮
whiten: 20, // 美白
ruddy: 10 // 红润
};
// 用户拖动滑块时调用
function updateBeautyOption(name, value) {
if (!Object.hasOwn(beautyOptions, name)) return;
const number = Number(value);
if (!Number.isFinite(number)) return;
beautyOptions[name] = Math.max(0, Math.min(100, number));
applyBeautyOptions(beautyOptions);
}
// SDK 适配入口
function applyBeautyOptions(options) {
// 在这里按照实际 SDK 文档:
// 1. 映射参数名称
// 2. 转换参数范围
// 3. 调用对应的美颜接口
console.log('当前美颜参数:', { ...options });
}
// 示例:把磨皮调到 40
updateBeautyOption('smooth', 40); 有在项目里接入过相芯美颜的朋友吗?想和大家交流一下实际使用体验,比如效果自然程度、设备兼容性,以及接入时遇到的问题。
个人觉得,美颜不一定要把参数拉满,保留一些皮肤质感、根据场景适当调整,画面会更耐看。
代码部分也可以把参数管理单独封装起来,界面负责调节,底层负责转换参数并调用 SDK,后续维护会方便一些。
另外,因为我这边买了一个包,有需要的同学可以一起用,支持月付、季付、年付,可以根据项目周期选择。有需求的话,先沟通使用平台、功能和授权范围,再确认是否适合。
有接入经验的朋友欢迎留言交流,需要了解插件的也可以联系我。
微信:【she195519】
添加时备注“相芯美颜”即可。
// 自定义界面参数,统一使用 0~100
const beautyOptions = {
smooth: 30, // 磨皮
whiten: 20, // 美白
ruddy: 10 // 红润
};
// 用户拖动滑块时调用
function updateBeautyOption(name, value) {
if (!Object.hasOwn(beautyOptions, name)) return;
const number = Number(value);
if (!Number.isFinite(number)) return;
beautyOptions[name] = Math.max(0, Math.min(100, number));
applyBeautyOptions(beautyOptions);
}
// SDK 适配入口
function applyBeautyOptions(options) {
// 在这里按照实际 SDK 文档:
// 1. 映射参数名称
// 2. 转换参数范围
// 3. 调用对应的美颜接口
console.log('当前美颜参数:', { ...options });
}
// 示例:把磨皮调到 40
updateBeautyOption('smooth', 40); 收起阅读 »
用 Agent 开发 uni-app,怎样让任务少停在半路?
作者:XylemNode 团队
用 Agent 开发 uni-app,方便的地方在于:它可以读取现有项目,找到需要修改的文件,完成改动,再根据检查结果继续调整。
你交给它的是一项开发任务,中间的读文件、改代码、看报错,可以由具备相应工具和权限的 Agent 连着处理。
但开始这样用以后,模型接入这一步就值得多花点心思。一个任务可能要经过多轮模型调用,期间还会执行本地操作。如果中途停下来,开发者需要知道:是模型请求没完成,还是构建报错?文件已经改到哪一步?接下来能不能继续?
下面就从 Agent 接入模型服务说起,聊聊用它开发 uni-app 时,哪些地方提前处理好,能少一些来回折腾。
模型服务接在 Agent 这一侧
先把关系说明白:开发者在编程 Agent 里配置模型服务,Agent 调用模型分析任务,再通过自己的工具读取、修改 uni-app 项目。
可以把它理解成:
开发者提出任务 → Agent 调用模型 → Agent 执行项目操作 → 把执行结果交给模型继续处理
以接入 XylemNode 为例,模型接口配置在支持自定义服务的 Agent 中,通常涉及接口地址、API Key 和模型名称,具体填写方式取决于该工具支持的协议。
这些是开发工具的配置,不需要为了使用 Agent,把模型服务的密钥写进 uni-app 的页面代码。
接好以后,建议先跑一个范围很小、但步骤完整的任务:读取相关文件,完成一处修改,再执行项目已有的检查。重点看 Agent 能否正确发起工具调用、收到执行结果,并据此继续处理。
因为在这种工作方式里,模型和工具之间会有往返:模型提出操作,客户端执行,再把结果传回。Anthropic 的工具调用文档介绍了这一过程。一次普通对话成功,还没有覆盖这些环节。
动手之前,先让 Agent 看懂你的 uni-app 项目
接入没问题,也不代表 Agent 已经了解项目约定。
目标是 H5、App 还是微信小程序?使用哪个版本的 Vue?项目通过 HBuilderX 管理,还是已经有命令行构建流程?现有组件和目录应该怎么沿用?
这些信息会影响它怎么改代码、怎么验证。让它先读项目配置和已有实现,可以减少凭空补一套结构、引入不必要依赖的情况。
开始任务时,可以附上几句要求:
> 先检查项目结构、依赖和目标平台,再开始修改。沿用现有组件和代码风格,新增依赖前说明原因。修改后执行项目已有的检查,并列出实际执行的命令与结果。需要在 HBuilderX、模拟器或真机上验证的步骤,单独列出来。
这里不适合给所有项目套一条固定的构建命令。Agent 能运行哪些检查,要看项目本身的配置和它具备的工具。没有执行的步骤,就保留为待验证项。
任务停下来,先分清是哪一段在等
一个修改任务可能经过这样的过程:读页面和组件、分析依赖关系、修改文件、执行检查,再根据报错继续修正。
中间既有模型请求,也有本地工具执行。看到 Agent 暂时没动静,先看它当前停在哪一步。
如果面板显示模型调用超时,就保留错误详情和请求编号,检查调用状态。如果已经拿到构建报错,就先围绕报错处理。如果工具正在等待权限或人工操作,则需要完成对应动作。
分清这些情况,才能避免没有必要的操作。构建失败时反复换接口,解决不了代码或环境问题;模型请求中断时,也不能据此认定刚才的文件修改没有执行。
尤其是任务已经改过文件的情况,继续之前先看文件差异和执行记录。如果修改已经完成,只剩检查没有跑完,就先确认能否从检查环节接着处理。
通道选择这类工作,可以少让人手动处理
对于模型调用本身,还有一部分恢复工作可以交给网关。
当某条调用路径暂时异常,而系统中存在其他符合请求要求的可用路径时,可以由网关按规则选择路径、尝试恢复,减少开发者手动切换配置的次数。
以我们 XylemNode 的 Auto 分组为例,它结合通道健康状态按策略选路,遇到通道异常时支持跨组重试,调用方继续使用原来的模型名。具体说明可以看官网的 Auto 分组介绍。
放到 Agent 开发流程里,这项能力承担的是模型请求的通道选择。开发者仍然决定任务使用哪个模型,也仍需由 Agent 管理工具执行和项目进度。
因此,通道恢复不能直接等同于整个开发任务恢复。已经写入的代码、运行过的命令,都需要结合实际状态继续处理;流式响应已经返回一部分时,也不能把重新请求理解成自动无缝续写。
接入时还应了解 Agent 和网关各自的重试规则,给尝试次数和总等待时间留出明确边界。这样,自动处理才不会变成一直等待,却不知道任务有没有进展。
最后看交付结果,别停在一句“已经完成”
用 Agent 开发 uni-app,最后还是要回到项目本身:改了哪些文件,修改是否符合要求,执行过哪些检查,目标平台上还有哪些内容需要验证。
可以要求 Agent 在结束时给出一份简短交代:
- 本次修改涉及哪些文件,分别解决了什么问题;
- 实际运行了哪些检查,结果是什么;
- 还有哪些页面表现或平台兼容性需要人工验证。
命令行检查通过,就记录这项结果。页面有没有显示异常、交互是否符合预期,以及目标设备上的表现,还要通过相应环境确认。
项目上下文交代清楚,Agent 才更容易按现有约定做事;模型接入和恢复规则理顺,才能减少一部分开发过程中的打断;检查结果留下来,下次继续任务也更有依据。
对开发者来说,省心的体验很具体:少一些来回改配置,任务中断后能看清进度,结束时拿得到可以检查的结果。
本文由 XylemNode 团队整理,AI 辅助起草,技术依据见文中链接。
作者:XylemNode 团队
用 Agent 开发 uni-app,方便的地方在于:它可以读取现有项目,找到需要修改的文件,完成改动,再根据检查结果继续调整。
你交给它的是一项开发任务,中间的读文件、改代码、看报错,可以由具备相应工具和权限的 Agent 连着处理。
但开始这样用以后,模型接入这一步就值得多花点心思。一个任务可能要经过多轮模型调用,期间还会执行本地操作。如果中途停下来,开发者需要知道:是模型请求没完成,还是构建报错?文件已经改到哪一步?接下来能不能继续?
下面就从 Agent 接入模型服务说起,聊聊用它开发 uni-app 时,哪些地方提前处理好,能少一些来回折腾。
模型服务接在 Agent 这一侧
先把关系说明白:开发者在编程 Agent 里配置模型服务,Agent 调用模型分析任务,再通过自己的工具读取、修改 uni-app 项目。
可以把它理解成:
开发者提出任务 → Agent 调用模型 → Agent 执行项目操作 → 把执行结果交给模型继续处理
以接入 XylemNode 为例,模型接口配置在支持自定义服务的 Agent 中,通常涉及接口地址、API Key 和模型名称,具体填写方式取决于该工具支持的协议。
这些是开发工具的配置,不需要为了使用 Agent,把模型服务的密钥写进 uni-app 的页面代码。
接好以后,建议先跑一个范围很小、但步骤完整的任务:读取相关文件,完成一处修改,再执行项目已有的检查。重点看 Agent 能否正确发起工具调用、收到执行结果,并据此继续处理。
因为在这种工作方式里,模型和工具之间会有往返:模型提出操作,客户端执行,再把结果传回。Anthropic 的工具调用文档介绍了这一过程。一次普通对话成功,还没有覆盖这些环节。
动手之前,先让 Agent 看懂你的 uni-app 项目
接入没问题,也不代表 Agent 已经了解项目约定。
目标是 H5、App 还是微信小程序?使用哪个版本的 Vue?项目通过 HBuilderX 管理,还是已经有命令行构建流程?现有组件和目录应该怎么沿用?
这些信息会影响它怎么改代码、怎么验证。让它先读项目配置和已有实现,可以减少凭空补一套结构、引入不必要依赖的情况。
开始任务时,可以附上几句要求:
> 先检查项目结构、依赖和目标平台,再开始修改。沿用现有组件和代码风格,新增依赖前说明原因。修改后执行项目已有的检查,并列出实际执行的命令与结果。需要在 HBuilderX、模拟器或真机上验证的步骤,单独列出来。
这里不适合给所有项目套一条固定的构建命令。Agent 能运行哪些检查,要看项目本身的配置和它具备的工具。没有执行的步骤,就保留为待验证项。
任务停下来,先分清是哪一段在等
一个修改任务可能经过这样的过程:读页面和组件、分析依赖关系、修改文件、执行检查,再根据报错继续修正。
中间既有模型请求,也有本地工具执行。看到 Agent 暂时没动静,先看它当前停在哪一步。
如果面板显示模型调用超时,就保留错误详情和请求编号,检查调用状态。如果已经拿到构建报错,就先围绕报错处理。如果工具正在等待权限或人工操作,则需要完成对应动作。
分清这些情况,才能避免没有必要的操作。构建失败时反复换接口,解决不了代码或环境问题;模型请求中断时,也不能据此认定刚才的文件修改没有执行。
尤其是任务已经改过文件的情况,继续之前先看文件差异和执行记录。如果修改已经完成,只剩检查没有跑完,就先确认能否从检查环节接着处理。
通道选择这类工作,可以少让人手动处理
对于模型调用本身,还有一部分恢复工作可以交给网关。
当某条调用路径暂时异常,而系统中存在其他符合请求要求的可用路径时,可以由网关按规则选择路径、尝试恢复,减少开发者手动切换配置的次数。
以我们 XylemNode 的 Auto 分组为例,它结合通道健康状态按策略选路,遇到通道异常时支持跨组重试,调用方继续使用原来的模型名。具体说明可以看官网的 Auto 分组介绍。
放到 Agent 开发流程里,这项能力承担的是模型请求的通道选择。开发者仍然决定任务使用哪个模型,也仍需由 Agent 管理工具执行和项目进度。
因此,通道恢复不能直接等同于整个开发任务恢复。已经写入的代码、运行过的命令,都需要结合实际状态继续处理;流式响应已经返回一部分时,也不能把重新请求理解成自动无缝续写。
接入时还应了解 Agent 和网关各自的重试规则,给尝试次数和总等待时间留出明确边界。这样,自动处理才不会变成一直等待,却不知道任务有没有进展。
最后看交付结果,别停在一句“已经完成”
用 Agent 开发 uni-app,最后还是要回到项目本身:改了哪些文件,修改是否符合要求,执行过哪些检查,目标平台上还有哪些内容需要验证。
可以要求 Agent 在结束时给出一份简短交代:
- 本次修改涉及哪些文件,分别解决了什么问题;
- 实际运行了哪些检查,结果是什么;
- 还有哪些页面表现或平台兼容性需要人工验证。
命令行检查通过,就记录这项结果。页面有没有显示异常、交互是否符合预期,以及目标设备上的表现,还要通过相应环境确认。
项目上下文交代清楚,Agent 才更容易按现有约定做事;模型接入和恢复规则理顺,才能减少一部分开发过程中的打断;检查结果留下来,下次继续任务也更有依据。
对开发者来说,省心的体验很具体:少一些来回改配置,任务中断后能看清进度,结束时拿得到可以检查的结果。
本文由 XylemNode 团队整理,AI 辅助起草,技术依据见文中链接。
收起阅读 »HAR 文件怎么打开?别人发来的抓包文件怎么接着分析
'''同事发来一个文件:接口报错.har,问"你帮我看看这个请求为啥 500"。文件收到了,双击却不知道用什么打开——浏览器拖进去没反应,记事本打开是一大坨 JSON,翻半天才找到那条出错的请求。这类场景在联调里出现得不少:抓的人有抓的工具,收的人拿到 HAR 文件或 pcap 文件,第一步就卡在"用什么打开"。
要解决的不只是"打开"。文件打开之后,怎么看懂内容、怎么和手头的成功请求做对比、怎么再交给下一个环节,是一条完整的链。下面按"拿到文件之后"的顺序,把这条链走一遍。
先认清手上的是什么文件
HAR 是已经解析好的请求清单。 全称 HTTP Archive,本质是一个 JSON 文件——浏览器 F12 的 Network 面板右键导出,Fiddler 也能导,每个请求的方法、URL、请求头、响应头、耗时都按结构化字段存在里面。它记录的是应用层的事:这个请求发了什么、回了什么。
HAR 的骨架长这样:
{
"log": {
"version": "1.2",
"entries": [
{
"request": { "method": "POST", "url": "https://api.example.com/order", "headers": [] },
"response": { "status": 500, "content": { "text": "...", "encoding": "base64" } }
}
]
}
}
注意 response.content 里的字段——encoding: base64 表示这段内容是二进制或压缩数据,原样看是乱的,得先解码。这个坑后面还会碰到。
pcap / pcapng 是网卡上的原始数据包。 Wireshark、tcpdump 抓完存的就是它,二进制格式,记录的是从网卡视角看到的原始包——一个 HTTP 请求在它眼里是若干 TCP 段,想看懂得先按连接把包重组起来。所以 pcap 的"打开"和 HAR 完全不是一回事:HAR 打开是看请求,pcap 打开先要解决"哪些包属于同一条连接、这条连接是不是 HTTPS 密文"。
还有一类是各家工具的私有会话格式:Charles 的 .chls、Fiddler 的 .saz,只能用原工具打开。给别人传文件时,导出成 HAR 比传私有格式通用。
把文件导进来
拿到文件,打开方式无非两条:找对应格式的工具,或者找一个都能吃下的。
分头解决的路线是:HAR 拖进 Chrome DevTools 的 Network 面板能看,pcap 交给 Wireshark,私有格式回原工具。这套分工能用,但文件一多就散——同事可能发来 HAR,也可能发来 Wireshark 存的 pcapng,得先判断"这归谁管"。
另一条路是用 TraceEagle 的"导入会话",HAR 1.2、.pcap / .pcapng、常见抓包工具导出的会话文件都从这一个入口进来。导入后请求就躺在列表里,跟本机抓的没有区别:切视图、看解码、查主机档案、拿去对比,都在同一套界面里。上次看同事给的 HAR 文件就是这么处理的,不用先想"该装什么软件",导进来直接看。
打开之后:三步读明白
导入只是开始,真正要回答的是"这个请求为什么出错"。
看内容。 先把乱码清零。HAR 里的 body 常是 base64 或压缩过的(开头那个 encoding: base64 就是),pcap 里非 HTTP 的流量本身是一堆原始字节。自动解压、自动识别格式、protobuf 免 .proto 解析、私有帧自动拆这一套在这里直接复用——导入的会话和本机抓的走同一套解码,不用因为"文件是别人抓的"就换流程。
查来源。 分析别人的包,经常要判断"这个域名、这个 IP 是什么来头"。HAR 里每个请求的主机名、pcap 里每个对端 IP,点开都有主机档案:归属地、ASN、证书信息、技术栈。查一个陌生 IP 的归属,不用对着地址段猜。
做对比。 这是导入场景里最实用的一步:同事抓的失败请求和你抓的成功请求,可以跨会话放在一起逐行比——参数、请求头、响应体哪里不一样。比"你把请求截图发我看看"来回几个回合高效得多,接口偶发失败这类问题,两份记录摆一起经常一眼出答案。
和常见工具怎么分工
这几个工具各管一段,位置挺清楚。
Chrome DevTools 看自己刚导出的 HAR 顺手,即开即用;但它开不了 pcap,也没法把两份 HAR 放一起比对。Wireshark 是 pcap 的专业户,包级分析(重传、时延、连接状态)没有替代品,代价是看 HTTP 内容要自己 follow stream,遇到 HTTPS 还得先有解密密钥。Charles、Fiddler 开自家会话最舒服,能改能重放,跨格式就弱一些。
TraceEagle 的位置在中间:HAR 和 pcap 都能进,进来之后解码、档案、对比、再导出一路通。实际用法多是组合——Wireshark 看完包级异常,把 pcap 导进来解出 HTTP 明文;或者同事用 Charles 抓的包导出 HAR,导进来和本地这份做对比。
问得最多的几件事
Chrome 导出的 HAR 怎么没有响应内容? 导出时选项没带对——浏览器的导出项里有"带内容"和"不带内容"两种,只有带内容的那份包含响应体。给别人导 HAR 文件排查问题时,记得选带内容的那种。
Wireshark 抓的 pcapng 导进来是明文还是密文? 看文件里有没有密钥。pcapng 可以把 TLS 解密密钥(SSLKEYLOGFILE 那套)一起写进文件,带了就能解出明文,没带就是原始密文,只能看包的特征。请对方导文件时,有条件的话顺手把密钥带上。
HAR 和 pcap 能互相转换吗? 不能直接转。HAR 是应用层的请求清单,pcap 是网卡层的原始包,信息不在一个层面——从 pcap 出 HAR 要先解密再完整重组,HAR 倒回 pcap 缺的是全部底层细节。两种格式都收的工具,内部是分别解析,不是转换。
同事发来的私有格式打不开怎么办? 请对方在原工具里导一份 HAR。HAR 1.2 是通用交换格式,浏览器和主流代理工具都认——你要把包发出去时,也可以照这个思路来。
收个尾
拿到抓包文件的分析路径可以固定下来:先看扩展名——.har 是应用层清单,找个能看 JSON 会话的工具或直接导进来;.pcap / .pcapng 是原始包,交给能重组连接的工具;私有格式请对方转 HAR。然后看、比、导:解码看清内容,对比找出差异,再导出交给下一个环节。
下次再收到同事发来的抓包文件,从"是 HAR 还是 pcap"判断起,后面的路就是一条直线。'''
'''同事发来一个文件:接口报错.har,问"你帮我看看这个请求为啥 500"。文件收到了,双击却不知道用什么打开——浏览器拖进去没反应,记事本打开是一大坨 JSON,翻半天才找到那条出错的请求。这类场景在联调里出现得不少:抓的人有抓的工具,收的人拿到 HAR 文件或 pcap 文件,第一步就卡在"用什么打开"。
要解决的不只是"打开"。文件打开之后,怎么看懂内容、怎么和手头的成功请求做对比、怎么再交给下一个环节,是一条完整的链。下面按"拿到文件之后"的顺序,把这条链走一遍。
先认清手上的是什么文件
HAR 是已经解析好的请求清单。 全称 HTTP Archive,本质是一个 JSON 文件——浏览器 F12 的 Network 面板右键导出,Fiddler 也能导,每个请求的方法、URL、请求头、响应头、耗时都按结构化字段存在里面。它记录的是应用层的事:这个请求发了什么、回了什么。
HAR 的骨架长这样:
{
"log": {
"version": "1.2",
"entries": [
{
"request": { "method": "POST", "url": "https://api.example.com/order", "headers": [] },
"response": { "status": 500, "content": { "text": "...", "encoding": "base64" } }
}
]
}
}
注意 response.content 里的字段——encoding: base64 表示这段内容是二进制或压缩数据,原样看是乱的,得先解码。这个坑后面还会碰到。
pcap / pcapng 是网卡上的原始数据包。 Wireshark、tcpdump 抓完存的就是它,二进制格式,记录的是从网卡视角看到的原始包——一个 HTTP 请求在它眼里是若干 TCP 段,想看懂得先按连接把包重组起来。所以 pcap 的"打开"和 HAR 完全不是一回事:HAR 打开是看请求,pcap 打开先要解决"哪些包属于同一条连接、这条连接是不是 HTTPS 密文"。
还有一类是各家工具的私有会话格式:Charles 的 .chls、Fiddler 的 .saz,只能用原工具打开。给别人传文件时,导出成 HAR 比传私有格式通用。
把文件导进来
拿到文件,打开方式无非两条:找对应格式的工具,或者找一个都能吃下的。
分头解决的路线是:HAR 拖进 Chrome DevTools 的 Network 面板能看,pcap 交给 Wireshark,私有格式回原工具。这套分工能用,但文件一多就散——同事可能发来 HAR,也可能发来 Wireshark 存的 pcapng,得先判断"这归谁管"。
另一条路是用 TraceEagle 的"导入会话",HAR 1.2、.pcap / .pcapng、常见抓包工具导出的会话文件都从这一个入口进来。导入后请求就躺在列表里,跟本机抓的没有区别:切视图、看解码、查主机档案、拿去对比,都在同一套界面里。上次看同事给的 HAR 文件就是这么处理的,不用先想"该装什么软件",导进来直接看。
打开之后:三步读明白
导入只是开始,真正要回答的是"这个请求为什么出错"。
看内容。 先把乱码清零。HAR 里的 body 常是 base64 或压缩过的(开头那个 encoding: base64 就是),pcap 里非 HTTP 的流量本身是一堆原始字节。自动解压、自动识别格式、protobuf 免 .proto 解析、私有帧自动拆这一套在这里直接复用——导入的会话和本机抓的走同一套解码,不用因为"文件是别人抓的"就换流程。
查来源。 分析别人的包,经常要判断"这个域名、这个 IP 是什么来头"。HAR 里每个请求的主机名、pcap 里每个对端 IP,点开都有主机档案:归属地、ASN、证书信息、技术栈。查一个陌生 IP 的归属,不用对着地址段猜。
做对比。 这是导入场景里最实用的一步:同事抓的失败请求和你抓的成功请求,可以跨会话放在一起逐行比——参数、请求头、响应体哪里不一样。比"你把请求截图发我看看"来回几个回合高效得多,接口偶发失败这类问题,两份记录摆一起经常一眼出答案。
和常见工具怎么分工
这几个工具各管一段,位置挺清楚。
Chrome DevTools 看自己刚导出的 HAR 顺手,即开即用;但它开不了 pcap,也没法把两份 HAR 放一起比对。Wireshark 是 pcap 的专业户,包级分析(重传、时延、连接状态)没有替代品,代价是看 HTTP 内容要自己 follow stream,遇到 HTTPS 还得先有解密密钥。Charles、Fiddler 开自家会话最舒服,能改能重放,跨格式就弱一些。
TraceEagle 的位置在中间:HAR 和 pcap 都能进,进来之后解码、档案、对比、再导出一路通。实际用法多是组合——Wireshark 看完包级异常,把 pcap 导进来解出 HTTP 明文;或者同事用 Charles 抓的包导出 HAR,导进来和本地这份做对比。
问得最多的几件事
Chrome 导出的 HAR 怎么没有响应内容? 导出时选项没带对——浏览器的导出项里有"带内容"和"不带内容"两种,只有带内容的那份包含响应体。给别人导 HAR 文件排查问题时,记得选带内容的那种。
Wireshark 抓的 pcapng 导进来是明文还是密文? 看文件里有没有密钥。pcapng 可以把 TLS 解密密钥(SSLKEYLOGFILE 那套)一起写进文件,带了就能解出明文,没带就是原始密文,只能看包的特征。请对方导文件时,有条件的话顺手把密钥带上。
HAR 和 pcap 能互相转换吗? 不能直接转。HAR 是应用层的请求清单,pcap 是网卡层的原始包,信息不在一个层面——从 pcap 出 HAR 要先解密再完整重组,HAR 倒回 pcap 缺的是全部底层细节。两种格式都收的工具,内部是分别解析,不是转换。
同事发来的私有格式打不开怎么办? 请对方在原工具里导一份 HAR。HAR 1.2 是通用交换格式,浏览器和主流代理工具都认——你要把包发出去时,也可以照这个思路来。
收个尾
拿到抓包文件的分析路径可以固定下来:先看扩展名——.har 是应用层清单,找个能看 JSON 会话的工具或直接导进来;.pcap / .pcapng 是原始包,交给能重组连接的工具;私有格式请对方转 HAR。然后看、比、导:解码看清内容,对比找出差异,再导出交给下一个环节。
下次再收到同事发来的抓包文件,从"是 HAR 还是 pcap"判断起,后面的路就是一条直线。'''
收起阅读 »如何在Canvas上实现涂抹效果
问题现象
在移动应用开发中,屏幕涂抹交互(如签名、涂鸦、擦除)是提升用户体验的关键功能。HarmonyOS的Canvas组件结合触摸事件监听与手势识别,为开发者提供了低门槛、高性能的2D图形绘制能力。本文将通过以下常见应用场景,详解如何在Canvas上实现涂抹效果:
场景一:如何结合手势或者事件实现滑动路径绘制?
场景二:如何撤销已绘制的路径?
场景三:如何擦除部分绘制内容?
背景知识
Canvas:提供画布组件,用于自定义绘制图形,开发者使用CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象在Canvas组件上进行绘制,绘制对象可以是基础形状、文本、图片等。
lineTo:从当前点到指定点进行路径连接。
globalCompositeOperation:设置合成操作的方式,默认值为source-over。
onTouch:手指触摸动作触发该回调。可以获取滑动过的路径坐标点。
PanGesture:滑动手势事件,当滑动的最小距离达到设定的最小值时触发滑动手势事件。
解决方案
场景一:结合手势或者事件实现路径绘制。
Canvas组件可以绑定触摸事件和滑动手势来获取手指按压时的坐标,在事件触发过程中可以根据event对象获取到在屏幕上触摸的点,再结合Canvas的lineTo方法就可以把手指移动过程中的路径给记录下来,达到手指滑动屏幕就绘制的效果。
onTouch实现如下:
@Entry
@Component
struct CanvasTouch {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor($r('sys.color.comp_background_focus'))
.onReady(() => {
this.context.lineWidth = 10;
this.context.strokeStyle = '#0000ff';
})
.onTouch((event: TouchEvent) => {
// 获取到触摸的坐标点
let x = event.touches[0].x;
let y = event.touches[0].y;
if (event.type == TouchType.Down) {
// 手指按下时画布移动到当前坐标点
this.context.beginPath();
this.context.moveTo(x, y);
}
if (event.type === TouchType.Move) {
// 手指移动时画布用线条连接到当前坐标点
this.context.lineTo(x, y);
this.context.stroke();
}
if (event.type === TouchType.Up) {
// 手指抬起时生成闭合路径
this.context.closePath();
}
})
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]);
};
}
}
PanGesture实现如下:
@Entry
@Component
struct CanvasPanGesture {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor($r('sys.color.comp_background_focus'))
.onReady(() => {
this.context.lineWidth = 10;
this.context.strokeStyle = '#0000ff';
})
.gesture(
PanGesture({ fingers: 1 })
.onActionStart((event: GestureEvent) => {
let x = event.fingerList[0].localX;
let y = event.fingerList[0].localY;
// 手指按下时画布移动到当前坐标点
this.context.beginPath();
this.context.moveTo(x, y);
})
.onActionUpdate((event: GestureEvent) => {
let x = event.fingerList[0].localX;
let y = event.fingerList[0].localY;
// 手指移动时画布用线条连接到当前坐标点
this.context.lineTo(x, y);
this.context.stroke();
})
.onActionEnd(() => {
// 手指抬起时生成闭合路径
this.context.closePath();
})
)
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]);
};
}
}
实现效果如下:
点击放大
场景二:撤销绘制的路径。
在一些签名场景,如果用户绘制错误需要重新绘制,直接使用clearRect方法清空画布体验不够友好,需要仅撤销最新的绘制路径,这时可以使用数组来存储绘制过程中的路径,然后点击撤销时移除最新路径,最后重绘剩余路径,这样即可实现撤销绘制功能。示例代码参考如下:
interface Point {
x: number;
y: number;
}
export class DrawingPath {
points: Point[] = [];
}
@Entry
@Component
struct CanvasCancelDraw {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
private paths: DrawingPath[] = [];
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('570vp')
.borderRadius(16)
.backgroundColor($r('sys.color.comp_background_focus'))
.onReady(() => {
this.context.lineWidth = 10;
this.context.strokeStyle = '#0000ff';
})
.onTouch((event: TouchEvent) => {
let x = event.touches[0].x;
let y = event.touches[0].y;
if (event.type == TouchType.Down) {
// 按下时新建一条路径
const path = new DrawingPath();
path.points.push({ x: x, y: y });
this.paths.push(path);
this.context.beginPath();
this.context.moveTo(x, y);
}
if (event.type === TouchType.Move) {
// 移动时把当前的坐标点放入最新的路径中
this.paths[this.paths.length - 1].points.push({ x: x, y: y });
this.context.lineTo(x, y);
this.context.stroke();
}
if (event.type === TouchType.Up) {
this.context.closePath();
}
});
Row({ space: 20 }) {
Button('清空')
.layoutWeight(1)
.onClick(() => {
this.paths = [];
this.context.clearRect(0, 0, this.context.width, this.context.height);
});
Button('撤销')
.layoutWeight(1)
.onClick(() => {
if (this.paths.length < 1) {
return;
}
this.paths.pop()!!;
this.context.clearRect(0, 0, this.context.width, this.context.height);
// 重绘保存的路径
this.paths.forEach((path) => {
if (path.points.length < 1) {
return;
}
this.context.beginPath();
this.context.moveTo(path.points[0].x, path.points[0].y);
for (let i = 0; i < path.points.length; i++) {
this.context.lineTo(path.points[i].x, path.points[i].y);
this.context.stroke();
}
this.context.closePath();
});
});
}.width('100%')
.justifyContent(FlexAlign.Center)
.margin(20);
}.padding(16);
}
}
https://coub.com/embed/kwki4m8ihy
https://coub.com/embed/1dc59ftpsz
https://coub.com/embed/1eg6k9knxq
https://coub.com/embed/ffcvsoqgy9
https://coub.com/embed/mtf20e2xfs
https://coub.com/embed/vcdyj2hsux
https://coub.com/embed/p8u435h7k0
https://coub.com/embed/53uc97iqzh
https://coub.com/embed/slklk9dip7
https://coub.com/embed/x5r8qua9dn
https://coub.com/embed/suzzf1tabm
https://coub.com/embed/iwlz1k4x5c
https://coub.com/embed/esio81b16u
https://coub.com/embed/08isxtzg6y
https://coub.com/embed/5t2ou1h0u1
https://coub.com/embed/2i826b72cf
https://coub.com/embed/wl4g0a80wd
https://coub.com/embed/noxtktrsld
https://coub.com/embed/4arm33ehej
https://coub.com/embed/4m5uhixzc6
https://coub.com/embed/z4hni578js
https://coub.com/embed/vc1lp4h9wv
https://coub.com/embed/ahq7q7smb9
https://coub.com/embed/s3agn3nkdx
https://coub.com/embed/0tpmvd839f
https://coub.com/embed/a52spj6rs2
https://coub.com/embed/mytvxbwrus
https://coub.com/embed/hto4op5jpb
https://coub.com/embed/5i13w22bho
https://coub.com/embed/ng8whwdnmh
https://coub.com/embed/4tepeaanko
https://coub.com/embed/gq6dpvlatn
https://coub.com/embed/n0xesp3qe7
https://coub.com/embed/i4ciaef3z2
https://coub.com/embed/h6tzz4imsh
https://coub.com/embed/5oh9y0o849
https://coub.com/embed/di1lvxi6rs
https://coub.com/embed/dvr0d1spum
https://coub.com/embed/a0chxn6q37
https://coub.com/embed/9kdpqt8gi3
https://coub.com/embed/wwtpzdcshr
https://coub.com/embed/i3j774nb78
https://coub.com/embed/9vdne44f87
https://coub.com/embed/di14nasb4i
https://coub.com/embed/tjdbi2z10f
https://coub.com/embed/xymgbl98l3
https://coub.com/embed/d46w9vg6y2
https://coub.com/embed/7kjd2r109r
https://coub.com/embed/ewtrtmuecq
https://coub.com/embed/x44fcmuuwa
https://coub.com/embed/ajx3cjloat
https://coub.com/embed/s9xf0u8gl8
https://coub.com/embed/9ogtzmbj73
https://coub.com/embed/2th49b4ms0
https://coub.com/embed/ke6047rz7q
https://coub.com/embed/m2oqeg89q8
https://coub.com/embed/774g3ow4sb
https://coub.com/embed/7548j9l7nl
https://coub.com/embed/zjz1qsyin2
https://coub.com/embed/xik7e7nili
https://coub.com/embed/zp95r4y15i
https://coub.com/embed/adde9a38t1
https://coub.com/embed/1qarvak9lx
https://coub.com/embed/dko4y9u0yf
https://coub.com/embed/ypw9dtvmab
https://coub.com/embed/8ewvlnn2b6
https://coub.com/embed/5s2dev0lra
https://coub.com/embed/c9fihrkf9u
https://coub.com/embed/xzeak1mhkt
https://coub.com/embed/t9dmppwno6
https://coub.com/embed/fz18zmri11
https://coub.com/embed/75espd6kkd
https://coub.com/embed/x2bbs1j2jb
https://coub.com/embed/fe3fwdnu88
https://coub.com/embed/ckzbjutpkj
https://coub.com/embed/qf0w3gxvy2
https://coub.com/embed/ux4gip7l5a
https://coub.com/embed/qavq5q9b1e
https://coub.com/embed/06dq1lpfmv
https://coub.com/embed/h9okejkccd
https://coub.com/embed/z59288b3bc
https://coub.com/embed/jdsgw25pj5
https://coub.com/embed/20ms41ljxh
https://coub.com/embed/cyjima3av9
https://coub.com/embed/xhymuinpm8
https://coub.com/embed/gqqk4335y1
https://coub.com/embed/9uflyvtfzv
https://coub.com/embed/ogd56p24ng
https://coub.com/embed/zydhfymmc3
https://coub.com/embed/pzd0ac0kg5
https://coub.com/embed/obdv3r4cy0
https://coub.com/embed/ka2mdh07zg
https://coub.com/embed/k8417q6t33
https://coub.com/embed/b797hoxnvb
https://coub.com/embed/p3wb9ayf0i
https://coub.com/embed/cylp42xa95
https://coub.com/embed/5vyv5859hb
https://coub.com/embed/uolo157r87
https://coub.com/embed/7bmp0nxmze
https://coub.com/embed/d2q6yzkrli
https://coub.com/embed/zs1hg1bhrv
https://coub.com/embed/yz4tqllp0u
https://coub.com/embed/a2kvibvldp
https://coub.com/embed/09kqx4xcfx
https://coub.com/embed/2c1zyd3kx3
https://coub.com/embed/wep5eg226t
https://coub.com/embed/su365ycwsu
https://coub.com/embed/nzdz5k3kr0
https://coub.com/embed/qg568ebu9j
https://coub.com/embed/md5pqvk50f
https://coub.com/embed/0gt0ay1zk3
https://coub.com/embed/hecylej9t3
https://coub.com/embed/wmxvxv1kkj
https://coub.com/embed/bxxpl0brtv
https://coub.com/embed/pholjf70ut
https://coub.com/embed/m8l2xwwy39
https://coub.com/embed/1c1x2w7t08
https://coub.com/embed/53mubpegym
https://coub.com/embed/on6slxqrt5
https://coub.com/embed/55q881xx6l
https://coub.com/embed/s77w2ok24r
https://coub.com/embed/4e9hy0237n
https://coub.com/embed/3entpjmdbw
https://coub.com/embed/8besg49zbq
https://coub.com/embed/usqat13gtl
https://coub.com/embed/66yxwx6676
https://coub.com/embed/np30bv52rn
https://coub.com/embed/3nk88ivl0b
https://coub.com/embed/83eyn5yj6r
https://coub.com/embed/bymmywq8fr
https://coub.com/embed/9bj0bp5xii
https://coub.com/embed/agvyb0zhme
https://coub.com/embed/8bcvp8upb3
https://coub.com/embed/c8p7zv5zan
https://coub.com/embed/yry7la9tco
https://coub.com/embed/ho2dopbp7j
https://coub.com/embed/amubk2uwuc
https://coub.com/embed/2jwoy1e4u4
https://coub.com/embed/ezz7hv58aq
https://coub.com/embed/sxb8y6f7cm
https://coub.com/embed/y4kvuhob20
https://coub.com/embed/t3iyg4zbk6
https://coub.com/embed/hlu3q922ul
https://coub.com/embed/wr5t1i5hjn
https://coub.com/embed/ig12bx6jem
https://coub.com/embed/elh7b4dm2v
https://coub.com/embed/p3aozbkqis
https://coub.com/embed/1x387gqa9h
https://coub.com/embed/11vq0o0urq
https://coub.com/embed/n95945i2xa
https://coub.com/embed/kwxot0bqpd
https://coub.com/embed/0bzsnthjf8
https://coub.com/embed/l6n7cci0v1
https://coub.com/embed/e33t42b2e8
https://coub.com/embed/uufau92iew
https://coub.com/embed/8nu2gzpi87
https://coub.com/embed/bzvc0eyha5
https://coub.com/embed/m7i31eulsq
https://coub.com/embed/1r27esow61
https://coub.com/embed/v18hqlwcpz
https://coub.com/embed/hltc1g5iav
https://coub.com/embed/eq093ohvb8
https://coub.com/embed/i44t54uooo
https://coub.com/embed/1p2epqlik8
https://coub.com/embed/r7s85h5tgs
https://coub.com/embed/x3a913pgtg
https://coub.com/embed/rm3vt5vimg
https://coub.com/embed/15wu728znl
https://coub.com/embed/2iwy8dlso1
https://coub.com/embed/9ecofudaq2
https://coub.com/embed/odtibqvqqb
https://coub.com/embed/kfit182kgd
https://coub.com/embed/oyuutd8klx
https://coub.com/embed/2ab3tdnsq2
https://coub.com/embed/0lxrs8kij0
https://coub.com/embed/o1b4imc38s
https://coub.com/embed/hmvpibka9g
https://coub.com/embed/pvj08u1amk
https://coub.com/embed/g3fxbal3j0
https://coub.com/embed/hunlqq2jwi
https://coub.com/embed/wsrr0y4x1q
https://coub.com/embed/kg284yqkff
https://coub.com/embed/hbiuts4e7e
https://coub.com/embed/cl8t4qvz2x
https://coub.com/embed/ydk9cyiff7
https://coub.com/embed/ek17k4yytm
https://coub.com/embed/y6t00hom1a
https://coub.com/embed/19q7wp5i00
https://coub.com/embed/4h8bxs9zz7
https://coub.com/embed/jwflpmph2z
https://coub.com/embed/f213jay0fp
https://coub.com/embed/bsf3lctm94
https://coub.com/embed/e83n1arbod
https://coub.com/embed/swembduv5h
https://coub.com/embed/n3fq7zzf5w
https://coub.com/embed/9lio0yr585
https://coub.com/embed/o4fakj61o0
https://coub.com/embed/1hjvwr455z
https://coub.com/embed/xzugpc1qds
https://coub.com/embed/ev7098ev03
https://coub.com/embed/kx4fsmb4b6
https://coub.com/embed/gcorgj2lp8
https://coub.com/embed/gsk38h0x1t
https://coub.com/embed/1gzcnq0drf
https://coub.com/embed/8kk1rohlkq
https://coub.com/embed/95lk677xts
https://coub.com/embed/klzoirlr0i
https://coub.com/embed/ruh9e6e23z
https://coub.com/embed/kaffn57ll3
https://coub.com/embed/wtwakxr59k
https://coub.com/embed/oq7e9iq28m
https://coub.com/embed/xf0mc6ti8q
https://coub.com/embed/ptjtimwt1u
https://coub.com/embed/uu6kt9484i
https://coub.com/embed/1upd83q7xu
https://coub.com/embed/kry12uzw3v
https://coub.com/embed/dtg6xjn98z
https://coub.com/embed/sn0yhm79wv
https://coub.com/embed/9gqnb8624w
https://coub.com/embed/p32o9d4k7v
https://coub.com/embed/e4p0k8n96b
https://coub.com/embed/ordooqx1q4
https://coub.com/embed/w0en3j9kmt
https://coub.com/embed/z925vaal0x
https://coub.com/embed/llsxxio2o3
https://coub.com/embed/xydiujzwro
https://coub.com/embed/2e486z583s
https://coub.com/embed/b850qpvdwf
https://coub.com/embed/uasf7vsd00
https://coub.com/embed/ne9r9ql0ke
https://coub.com/embed/wrb0dawhk3
https://coub.com/embed/e7vo2n3rv0
https://coub.com/embed/sq5lb2quya
https://coub.com/embed/q7er5zdf9c
https://coub.com/embed/hijacyi6zc
问题现象
在移动应用开发中,屏幕涂抹交互(如签名、涂鸦、擦除)是提升用户体验的关键功能。HarmonyOS的Canvas组件结合触摸事件监听与手势识别,为开发者提供了低门槛、高性能的2D图形绘制能力。本文将通过以下常见应用场景,详解如何在Canvas上实现涂抹效果:
场景一:如何结合手势或者事件实现滑动路径绘制?
场景二:如何撤销已绘制的路径?
场景三:如何擦除部分绘制内容?
背景知识
Canvas:提供画布组件,用于自定义绘制图形,开发者使用CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象在Canvas组件上进行绘制,绘制对象可以是基础形状、文本、图片等。
lineTo:从当前点到指定点进行路径连接。
globalCompositeOperation:设置合成操作的方式,默认值为source-over。
onTouch:手指触摸动作触发该回调。可以获取滑动过的路径坐标点。
PanGesture:滑动手势事件,当滑动的最小距离达到设定的最小值时触发滑动手势事件。
解决方案
场景一:结合手势或者事件实现路径绘制。
Canvas组件可以绑定触摸事件和滑动手势来获取手指按压时的坐标,在事件触发过程中可以根据event对象获取到在屏幕上触摸的点,再结合Canvas的lineTo方法就可以把手指移动过程中的路径给记录下来,达到手指滑动屏幕就绘制的效果。
onTouch实现如下:
@Entry
@Component
struct CanvasTouch {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor($r('sys.color.comp_background_focus'))
.onReady(() => {
this.context.lineWidth = 10;
this.context.strokeStyle = '#0000ff';
})
.onTouch((event: TouchEvent) => {
// 获取到触摸的坐标点
let x = event.touches[0].x;
let y = event.touches[0].y;
if (event.type == TouchType.Down) {
// 手指按下时画布移动到当前坐标点
this.context.beginPath();
this.context.moveTo(x, y);
}
if (event.type === TouchType.Move) {
// 手指移动时画布用线条连接到当前坐标点
this.context.lineTo(x, y);
this.context.stroke();
}
if (event.type === TouchType.Up) {
// 手指抬起时生成闭合路径
this.context.closePath();
}
})
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]);
};
}
}
PanGesture实现如下:
@Entry
@Component
struct CanvasPanGesture {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor($r('sys.color.comp_background_focus'))
.onReady(() => {
this.context.lineWidth = 10;
this.context.strokeStyle = '#0000ff';
})
.gesture(
PanGesture({ fingers: 1 })
.onActionStart((event: GestureEvent) => {
let x = event.fingerList[0].localX;
let y = event.fingerList[0].localY;
// 手指按下时画布移动到当前坐标点
this.context.beginPath();
this.context.moveTo(x, y);
})
.onActionUpdate((event: GestureEvent) => {
let x = event.fingerList[0].localX;
let y = event.fingerList[0].localY;
// 手指移动时画布用线条连接到当前坐标点
this.context.lineTo(x, y);
this.context.stroke();
})
.onActionEnd(() => {
// 手指抬起时生成闭合路径
this.context.closePath();
})
)
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]);
};
}
}
实现效果如下:
点击放大
场景二:撤销绘制的路径。
在一些签名场景,如果用户绘制错误需要重新绘制,直接使用clearRect方法清空画布体验不够友好,需要仅撤销最新的绘制路径,这时可以使用数组来存储绘制过程中的路径,然后点击撤销时移除最新路径,最后重绘剩余路径,这样即可实现撤销绘制功能。示例代码参考如下:
interface Point {
x: number;
y: number;
}
export class DrawingPath {
points: Point[] = [];
}
@Entry
@Component
struct CanvasCancelDraw {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
private paths: DrawingPath[] = [];
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('570vp')
.borderRadius(16)
.backgroundColor($r('sys.color.comp_background_focus'))
.onReady(() => {
this.context.lineWidth = 10;
this.context.strokeStyle = '#0000ff';
})
.onTouch((event: TouchEvent) => {
let x = event.touches[0].x;
let y = event.touches[0].y;
if (event.type == TouchType.Down) {
// 按下时新建一条路径
const path = new DrawingPath();
path.points.push({ x: x, y: y });
this.paths.push(path);
this.context.beginPath();
this.context.moveTo(x, y);
}
if (event.type === TouchType.Move) {
// 移动时把当前的坐标点放入最新的路径中
this.paths[this.paths.length - 1].points.push({ x: x, y: y });
this.context.lineTo(x, y);
this.context.stroke();
}
if (event.type === TouchType.Up) {
this.context.closePath();
}
});
Row({ space: 20 }) {
Button('清空')
.layoutWeight(1)
.onClick(() => {
this.paths = [];
this.context.clearRect(0, 0, this.context.width, this.context.height);
});
Button('撤销')
.layoutWeight(1)
.onClick(() => {
if (this.paths.length < 1) {
return;
}
this.paths.pop()!!;
this.context.clearRect(0, 0, this.context.width, this.context.height);
// 重绘保存的路径
this.paths.forEach((path) => {
if (path.points.length < 1) {
return;
}
this.context.beginPath();
this.context.moveTo(path.points[0].x, path.points[0].y);
for (let i = 0; i < path.points.length; i++) {
this.context.lineTo(path.points[i].x, path.points[i].y);
this.context.stroke();
}
this.context.closePath();
});
});
}.width('100%')
.justifyContent(FlexAlign.Center)
.margin(20);
}.padding(16);
}
}
https://coub.com/embed/kwki4m8ihy
https://coub.com/embed/1dc59ftpsz
https://coub.com/embed/1eg6k9knxq
https://coub.com/embed/ffcvsoqgy9
https://coub.com/embed/mtf20e2xfs
https://coub.com/embed/vcdyj2hsux
https://coub.com/embed/p8u435h7k0
https://coub.com/embed/53uc97iqzh
https://coub.com/embed/slklk9dip7
https://coub.com/embed/x5r8qua9dn
https://coub.com/embed/suzzf1tabm
https://coub.com/embed/iwlz1k4x5c
https://coub.com/embed/esio81b16u
https://coub.com/embed/08isxtzg6y
https://coub.com/embed/5t2ou1h0u1
https://coub.com/embed/2i826b72cf
https://coub.com/embed/wl4g0a80wd
https://coub.com/embed/noxtktrsld
https://coub.com/embed/4arm33ehej
https://coub.com/embed/4m5uhixzc6
https://coub.com/embed/z4hni578js
https://coub.com/embed/vc1lp4h9wv
https://coub.com/embed/ahq7q7smb9
https://coub.com/embed/s3agn3nkdx
https://coub.com/embed/0tpmvd839f
https://coub.com/embed/a52spj6rs2
https://coub.com/embed/mytvxbwrus
https://coub.com/embed/hto4op5jpb
https://coub.com/embed/5i13w22bho
https://coub.com/embed/ng8whwdnmh
https://coub.com/embed/4tepeaanko
https://coub.com/embed/gq6dpvlatn
https://coub.com/embed/n0xesp3qe7
https://coub.com/embed/i4ciaef3z2
https://coub.com/embed/h6tzz4imsh
https://coub.com/embed/5oh9y0o849
https://coub.com/embed/di1lvxi6rs
https://coub.com/embed/dvr0d1spum
https://coub.com/embed/a0chxn6q37
https://coub.com/embed/9kdpqt8gi3
https://coub.com/embed/wwtpzdcshr
https://coub.com/embed/i3j774nb78
https://coub.com/embed/9vdne44f87
https://coub.com/embed/di14nasb4i
https://coub.com/embed/tjdbi2z10f
https://coub.com/embed/xymgbl98l3
https://coub.com/embed/d46w9vg6y2
https://coub.com/embed/7kjd2r109r
https://coub.com/embed/ewtrtmuecq
https://coub.com/embed/x44fcmuuwa
https://coub.com/embed/ajx3cjloat
https://coub.com/embed/s9xf0u8gl8
https://coub.com/embed/9ogtzmbj73
https://coub.com/embed/2th49b4ms0
https://coub.com/embed/ke6047rz7q
https://coub.com/embed/m2oqeg89q8
https://coub.com/embed/774g3ow4sb
https://coub.com/embed/7548j9l7nl
https://coub.com/embed/zjz1qsyin2
https://coub.com/embed/xik7e7nili
https://coub.com/embed/zp95r4y15i
https://coub.com/embed/adde9a38t1
https://coub.com/embed/1qarvak9lx
https://coub.com/embed/dko4y9u0yf
https://coub.com/embed/ypw9dtvmab
https://coub.com/embed/8ewvlnn2b6
https://coub.com/embed/5s2dev0lra
https://coub.com/embed/c9fihrkf9u
https://coub.com/embed/xzeak1mhkt
https://coub.com/embed/t9dmppwno6
https://coub.com/embed/fz18zmri11
https://coub.com/embed/75espd6kkd
https://coub.com/embed/x2bbs1j2jb
https://coub.com/embed/fe3fwdnu88
https://coub.com/embed/ckzbjutpkj
https://coub.com/embed/qf0w3gxvy2
https://coub.com/embed/ux4gip7l5a
https://coub.com/embed/qavq5q9b1e
https://coub.com/embed/06dq1lpfmv
https://coub.com/embed/h9okejkccd
https://coub.com/embed/z59288b3bc
https://coub.com/embed/jdsgw25pj5
https://coub.com/embed/20ms41ljxh
https://coub.com/embed/cyjima3av9
https://coub.com/embed/xhymuinpm8
https://coub.com/embed/gqqk4335y1
https://coub.com/embed/9uflyvtfzv
https://coub.com/embed/ogd56p24ng
https://coub.com/embed/zydhfymmc3
https://coub.com/embed/pzd0ac0kg5
https://coub.com/embed/obdv3r4cy0
https://coub.com/embed/ka2mdh07zg
https://coub.com/embed/k8417q6t33
https://coub.com/embed/b797hoxnvb
https://coub.com/embed/p3wb9ayf0i
https://coub.com/embed/cylp42xa95
https://coub.com/embed/5vyv5859hb
https://coub.com/embed/uolo157r87
https://coub.com/embed/7bmp0nxmze
https://coub.com/embed/d2q6yzkrli
https://coub.com/embed/zs1hg1bhrv
https://coub.com/embed/yz4tqllp0u
https://coub.com/embed/a2kvibvldp
https://coub.com/embed/09kqx4xcfx
https://coub.com/embed/2c1zyd3kx3
https://coub.com/embed/wep5eg226t
https://coub.com/embed/su365ycwsu
https://coub.com/embed/nzdz5k3kr0
https://coub.com/embed/qg568ebu9j
https://coub.com/embed/md5pqvk50f
https://coub.com/embed/0gt0ay1zk3
https://coub.com/embed/hecylej9t3
https://coub.com/embed/wmxvxv1kkj
https://coub.com/embed/bxxpl0brtv
https://coub.com/embed/pholjf70ut
https://coub.com/embed/m8l2xwwy39
https://coub.com/embed/1c1x2w7t08
https://coub.com/embed/53mubpegym
https://coub.com/embed/on6slxqrt5
https://coub.com/embed/55q881xx6l
https://coub.com/embed/s77w2ok24r
https://coub.com/embed/4e9hy0237n
https://coub.com/embed/3entpjmdbw
https://coub.com/embed/8besg49zbq
https://coub.com/embed/usqat13gtl
https://coub.com/embed/66yxwx6676
https://coub.com/embed/np30bv52rn
https://coub.com/embed/3nk88ivl0b
https://coub.com/embed/83eyn5yj6r
https://coub.com/embed/bymmywq8fr
https://coub.com/embed/9bj0bp5xii
https://coub.com/embed/agvyb0zhme
https://coub.com/embed/8bcvp8upb3
https://coub.com/embed/c8p7zv5zan
https://coub.com/embed/yry7la9tco
https://coub.com/embed/ho2dopbp7j
https://coub.com/embed/amubk2uwuc
https://coub.com/embed/2jwoy1e4u4
https://coub.com/embed/ezz7hv58aq
https://coub.com/embed/sxb8y6f7cm
https://coub.com/embed/y4kvuhob20
https://coub.com/embed/t3iyg4zbk6
https://coub.com/embed/hlu3q922ul
https://coub.com/embed/wr5t1i5hjn
https://coub.com/embed/ig12bx6jem
https://coub.com/embed/elh7b4dm2v
https://coub.com/embed/p3aozbkqis
https://coub.com/embed/1x387gqa9h
https://coub.com/embed/11vq0o0urq
https://coub.com/embed/n95945i2xa
https://coub.com/embed/kwxot0bqpd
https://coub.com/embed/0bzsnthjf8
https://coub.com/embed/l6n7cci0v1
https://coub.com/embed/e33t42b2e8
https://coub.com/embed/uufau92iew
https://coub.com/embed/8nu2gzpi87
https://coub.com/embed/bzvc0eyha5
https://coub.com/embed/m7i31eulsq
https://coub.com/embed/1r27esow61
https://coub.com/embed/v18hqlwcpz
https://coub.com/embed/hltc1g5iav
https://coub.com/embed/eq093ohvb8
https://coub.com/embed/i44t54uooo
https://coub.com/embed/1p2epqlik8
https://coub.com/embed/r7s85h5tgs
https://coub.com/embed/x3a913pgtg
https://coub.com/embed/rm3vt5vimg
https://coub.com/embed/15wu728znl
https://coub.com/embed/2iwy8dlso1
https://coub.com/embed/9ecofudaq2
https://coub.com/embed/odtibqvqqb
https://coub.com/embed/kfit182kgd
https://coub.com/embed/oyuutd8klx
https://coub.com/embed/2ab3tdnsq2
https://coub.com/embed/0lxrs8kij0
https://coub.com/embed/o1b4imc38s
https://coub.com/embed/hmvpibka9g
https://coub.com/embed/pvj08u1amk
https://coub.com/embed/g3fxbal3j0
https://coub.com/embed/hunlqq2jwi
https://coub.com/embed/wsrr0y4x1q
https://coub.com/embed/kg284yqkff
https://coub.com/embed/hbiuts4e7e
https://coub.com/embed/cl8t4qvz2x
https://coub.com/embed/ydk9cyiff7
https://coub.com/embed/ek17k4yytm
https://coub.com/embed/y6t00hom1a
https://coub.com/embed/19q7wp5i00
https://coub.com/embed/4h8bxs9zz7
https://coub.com/embed/jwflpmph2z
https://coub.com/embed/f213jay0fp
https://coub.com/embed/bsf3lctm94
https://coub.com/embed/e83n1arbod
https://coub.com/embed/swembduv5h
https://coub.com/embed/n3fq7zzf5w
https://coub.com/embed/9lio0yr585
https://coub.com/embed/o4fakj61o0
https://coub.com/embed/1hjvwr455z
https://coub.com/embed/xzugpc1qds
https://coub.com/embed/ev7098ev03
https://coub.com/embed/kx4fsmb4b6
https://coub.com/embed/gcorgj2lp8
https://coub.com/embed/gsk38h0x1t
https://coub.com/embed/1gzcnq0drf
https://coub.com/embed/8kk1rohlkq
https://coub.com/embed/95lk677xts
https://coub.com/embed/klzoirlr0i
https://coub.com/embed/ruh9e6e23z
https://coub.com/embed/kaffn57ll3
https://coub.com/embed/wtwakxr59k
https://coub.com/embed/oq7e9iq28m
https://coub.com/embed/xf0mc6ti8q
https://coub.com/embed/ptjtimwt1u
https://coub.com/embed/uu6kt9484i
https://coub.com/embed/1upd83q7xu
https://coub.com/embed/kry12uzw3v
https://coub.com/embed/dtg6xjn98z
https://coub.com/embed/sn0yhm79wv
https://coub.com/embed/9gqnb8624w
https://coub.com/embed/p32o9d4k7v
https://coub.com/embed/e4p0k8n96b
https://coub.com/embed/ordooqx1q4
https://coub.com/embed/w0en3j9kmt
https://coub.com/embed/z925vaal0x
https://coub.com/embed/llsxxio2o3
https://coub.com/embed/xydiujzwro
https://coub.com/embed/2e486z583s
https://coub.com/embed/b850qpvdwf
https://coub.com/embed/uasf7vsd00
https://coub.com/embed/ne9r9ql0ke
https://coub.com/embed/wrb0dawhk3
https://coub.com/embed/e7vo2n3rv0
https://coub.com/embed/sq5lb2quya
https://coub.com/embed/q7er5zdf9c
https://coub.com/embed/hijacyi6zc
列表选择弹窗ActionSheet的sheets属性无法实时更新
问题现象
动态改变列表选择弹窗ActionSheet的sheets属性,弹窗内容无法实时更新。问题代码示例参考如下:
@Entry
@Component
struct showActionSheetExample {
@State sheets: Array<SheetInfo> = [{
title: 'apples',
action: () => {
}
}];
@State count: number = 0;
build() {
Column() {
Button('showActionSheet')
.margin(30)
.onClick(() => {
setInterval(() => {
this.count++;
this.sheets.push({
title: 'bananas' + this.count,
action: () => {
}
});
}, 1000);
this.getUIContext().showActionSheet({
title: 'ActionSheet title',
message: 'message',
confirm: {
value: 'Confirm button',
action: () => {
console.info('Get Alert Dialog handled');
}
},
alignment: DialogAlignment.Center,
sheets: this.sheets
});
});
}.width('100%');
}
}
背景知识
列表选择弹窗 (ActionSheet)是一个列表选择器弹窗适用于呈现多个操作选项,尤其当界面中仅需展示操作列表而无其他内容时。固定样式,当用户需要关注或确认的信息存在列表选择时使用。
当用户需要自定义弹出框内动态更新弹出框属性和内容时,使用不依赖UI组件的自定义弹出框 (openCustomDialog)。存在两种入参方式创建自定义弹出框:
openCustomDialog(传参为ComponentContent形式):通过ComponentContent封装内容可以与UI界面解耦,调用更加灵活,可以满足开发者的封装诉求。具有较高的灵活性,弹出框样式完全自定义,并且在弹出框打开后可以使用updateCustomDialog方法动态更新弹出框的参数。
openCustomDialog(传builder的形式):相对于ComponentContent,builder必须要与上下文做绑定,与UI存在一定耦合。此方法有默认的弹出框样式,适合于开发者想要实现与系统弹窗默认风格一致的效果。
问题定位
在showActionSheet打开列表选择弹窗后,对sheets属性进行动态修改,弹窗UI未变化。
分析结论
ActionSheet列表选择弹窗不支持动态更新属性,需要通过自定义弹出框实现。
修改建议
下面通过openCustomDialog实现,并且以传builder的形式为例,实现动态更新自定义弹出框的内容。
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
private customDialogComponentId: number = 0;
@State count: number = 0;
intervalId?: number;
@Builder
customDialogComponent() {
Column() {
Text('充电详情').fontSize(25);
Text(已充电时间:${this.count}秒);
Row({ space: 50 }) {
Button('确认').onClick(() => {
this.getUIContext().getPromptAction().closeCustomDialog(this.customDialogComponentId);
clearInterval(this.intervalId);
});
Button('取消').onClick(() => {
this.getUIContext().getPromptAction().closeCustomDialog(this.customDialogComponentId);
clearInterval(this.intervalId);
});
};
}.height(200).padding(5).justifyContent(FlexAlign.SpaceAround);
}
build() {
Row() {
Column({ space: 20 }) {
Text('组件内弹窗')
.fontSize(30)
.onClick(() => {
this.getUIContext()
.getPromptAction()
.openCustomDialog({
builder: () => {
this.customDialogComponent();
}
})
.then((dialogId: number) => {
this.customDialogComponentId = dialogId;
})
.catch((error: BusinessError) => {
console.error(openCustomDialog error code is ${error.code}, message is ${error.message});
});
this.intervalId = setInterval(() => {
this.count++;
}, 1 * 1000);
});
}
.width('100%');
}
.height('100%');
}
}
https://coub.com/view/06dq1lpfmv
https://coub.com/view/h9okejkccd
https://coub.com/view/z59288b3bc
https://coub.com/view/jdsgw25pj5
https://coub.com/view/20ms41ljxh
https://coub.com/view/cyjima3av9
https://coub.com/view/xhymuinpm8
https://coub.com/view/gqqk4335y1
https://coub.com/view/9uflyvtfzv
https://coub.com/view/ogd56p24ng
https://coub.com/view/zydhfymmc3
https://coub.com/view/pzd0ac0kg5
https://coub.com/view/obdv3r4cy0
https://coub.com/view/ka2mdh07zg
https://coub.com/view/k8417q6t33
https://coub.com/view/b797hoxnvb
https://coub.com/view/p3wb9ayf0i
https://coub.com/view/cylp42xa95
https://coub.com/view/5vyv5859hb
https://coub.com/view/uolo157r87
https://coub.com/view/7bmp0nxmze
https://coub.com/view/d2q6yzkrli
https://coub.com/view/zs1hg1bhrv
https://coub.com/view/yz4tqllp0u
https://coub.com/view/a2kvibvldp
https://coub.com/view/09kqx4xcfx
https://coub.com/view/2c1zyd3kx3
https://coub.com/view/wep5eg226t
https://coub.com/view/su365ycwsu
https://coub.com/view/nzdz5k3kr0
https://coub.com/view/qg568ebu9j
https://coub.com/view/md5pqvk50f
https://coub.com/view/0gt0ay1zk3
https://coub.com/view/hecylej9t3
https://coub.com/view/wmxvxv1kkj
https://coub.com/view/bxxpl0brtv
https://coub.com/view/pholjf70ut
https://coub.com/view/m8l2xwwy39
https://coub.com/view/1c1x2w7t08
https://coub.com/view/53mubpegym
https://coub.com/view/on6slxqrt5
https://coub.com/view/55q881xx6l
https://coub.com/view/s77w2ok24r
https://coub.com/view/4e9hy0237n
https://coub.com/view/3entpjmdbw
https://coub.com/view/8besg49zbq
https://coub.com/view/usqat13gtl
https://coub.com/view/66yxwx6676
https://coub.com/view/np30bv52rn
https://coub.com/view/3nk88ivl0b
https://coub.com/view/83eyn5yj6r
https://coub.com/view/bymmywq8fr
https://coub.com/view/9bj0bp5xii
https://coub.com/view/agvyb0zhme
https://coub.com/view/8bcvp8upb3
https://coub.com/view/c8p7zv5zan
https://coub.com/view/yry7la9tco
https://coub.com/view/ho2dopbp7j
https://coub.com/view/amubk2uwuc
https://coub.com/view/2jwoy1e4u4
https://coub.com/view/ezz7hv58aq
https://coub.com/view/sxb8y6f7cm
https://coub.com/view/y4kvuhob20
https://coub.com/view/t3iyg4zbk6
https://coub.com/view/hlu3q922ul
https://coub.com/view/wr5t1i5hjn
https://coub.com/view/ig12bx6jem
https://coub.com/view/elh7b4dm2v
https://coub.com/view/p3aozbkqis
https://coub.com/view/1x387gqa9h
https://coub.com/view/11vq0o0urq
https://coub.com/view/n95945i2xa
https://coub.com/view/kwxot0bqpd
https://coub.com/view/0bzsnthjf8
https://coub.com/view/l6n7cci0v1
https://coub.com/view/e33t42b2e8
https://coub.com/view/uufau92iew
https://coub.com/view/8nu2gzpi87
https://coub.com/view/bzvc0eyha5
https://coub.com/view/m7i31eulsq
问题现象
动态改变列表选择弹窗ActionSheet的sheets属性,弹窗内容无法实时更新。问题代码示例参考如下:
@Entry
@Component
struct showActionSheetExample {
@State sheets: Array<SheetInfo> = [{
title: 'apples',
action: () => {
}
}];
@State count: number = 0;
build() {
Column() {
Button('showActionSheet')
.margin(30)
.onClick(() => {
setInterval(() => {
this.count++;
this.sheets.push({
title: 'bananas' + this.count,
action: () => {
}
});
}, 1000);
this.getUIContext().showActionSheet({
title: 'ActionSheet title',
message: 'message',
confirm: {
value: 'Confirm button',
action: () => {
console.info('Get Alert Dialog handled');
}
},
alignment: DialogAlignment.Center,
sheets: this.sheets
});
});
}.width('100%');
}
}
背景知识
列表选择弹窗 (ActionSheet)是一个列表选择器弹窗适用于呈现多个操作选项,尤其当界面中仅需展示操作列表而无其他内容时。固定样式,当用户需要关注或确认的信息存在列表选择时使用。
当用户需要自定义弹出框内动态更新弹出框属性和内容时,使用不依赖UI组件的自定义弹出框 (openCustomDialog)。存在两种入参方式创建自定义弹出框:
openCustomDialog(传参为ComponentContent形式):通过ComponentContent封装内容可以与UI界面解耦,调用更加灵活,可以满足开发者的封装诉求。具有较高的灵活性,弹出框样式完全自定义,并且在弹出框打开后可以使用updateCustomDialog方法动态更新弹出框的参数。
openCustomDialog(传builder的形式):相对于ComponentContent,builder必须要与上下文做绑定,与UI存在一定耦合。此方法有默认的弹出框样式,适合于开发者想要实现与系统弹窗默认风格一致的效果。
问题定位
在showActionSheet打开列表选择弹窗后,对sheets属性进行动态修改,弹窗UI未变化。
分析结论
ActionSheet列表选择弹窗不支持动态更新属性,需要通过自定义弹出框实现。
修改建议
下面通过openCustomDialog实现,并且以传builder的形式为例,实现动态更新自定义弹出框的内容。
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
private customDialogComponentId: number = 0;
@State count: number = 0;
intervalId?: number;
@Builder
customDialogComponent() {
Column() {
Text('充电详情').fontSize(25);
Text(已充电时间:${this.count}秒);
Row({ space: 50 }) {
Button('确认').onClick(() => {
this.getUIContext().getPromptAction().closeCustomDialog(this.customDialogComponentId);
clearInterval(this.intervalId);
});
Button('取消').onClick(() => {
this.getUIContext().getPromptAction().closeCustomDialog(this.customDialogComponentId);
clearInterval(this.intervalId);
});
};
}.height(200).padding(5).justifyContent(FlexAlign.SpaceAround);
}
build() {
Row() {
Column({ space: 20 }) {
Text('组件内弹窗')
.fontSize(30)
.onClick(() => {
this.getUIContext()
.getPromptAction()
.openCustomDialog({
builder: () => {
this.customDialogComponent();
}
})
.then((dialogId: number) => {
this.customDialogComponentId = dialogId;
})
.catch((error: BusinessError) => {
console.error(openCustomDialog error code is ${error.code}, message is ${error.message});
});
this.intervalId = setInterval(() => {
this.count++;
}, 1 * 1000);
});
}
.width('100%');
}
.height('100%');
}
}
https://coub.com/view/06dq1lpfmv
https://coub.com/view/h9okejkccd
https://coub.com/view/z59288b3bc
https://coub.com/view/jdsgw25pj5
https://coub.com/view/20ms41ljxh
https://coub.com/view/cyjima3av9
https://coub.com/view/xhymuinpm8
https://coub.com/view/gqqk4335y1
https://coub.com/view/9uflyvtfzv
https://coub.com/view/ogd56p24ng
https://coub.com/view/zydhfymmc3
https://coub.com/view/pzd0ac0kg5
https://coub.com/view/obdv3r4cy0
https://coub.com/view/ka2mdh07zg
https://coub.com/view/k8417q6t33
https://coub.com/view/b797hoxnvb
https://coub.com/view/p3wb9ayf0i
https://coub.com/view/cylp42xa95
https://coub.com/view/5vyv5859hb
https://coub.com/view/uolo157r87
https://coub.com/view/7bmp0nxmze
https://coub.com/view/d2q6yzkrli
https://coub.com/view/zs1hg1bhrv
https://coub.com/view/yz4tqllp0u
https://coub.com/view/a2kvibvldp
https://coub.com/view/09kqx4xcfx
https://coub.com/view/2c1zyd3kx3
https://coub.com/view/wep5eg226t
https://coub.com/view/su365ycwsu
https://coub.com/view/nzdz5k3kr0
https://coub.com/view/qg568ebu9j
https://coub.com/view/md5pqvk50f
https://coub.com/view/0gt0ay1zk3
https://coub.com/view/hecylej9t3
https://coub.com/view/wmxvxv1kkj
https://coub.com/view/bxxpl0brtv
https://coub.com/view/pholjf70ut
https://coub.com/view/m8l2xwwy39
https://coub.com/view/1c1x2w7t08
https://coub.com/view/53mubpegym
https://coub.com/view/on6slxqrt5
https://coub.com/view/55q881xx6l
https://coub.com/view/s77w2ok24r
https://coub.com/view/4e9hy0237n
https://coub.com/view/3entpjmdbw
https://coub.com/view/8besg49zbq
https://coub.com/view/usqat13gtl
https://coub.com/view/66yxwx6676
https://coub.com/view/np30bv52rn
https://coub.com/view/3nk88ivl0b
https://coub.com/view/83eyn5yj6r
https://coub.com/view/bymmywq8fr
https://coub.com/view/9bj0bp5xii
https://coub.com/view/agvyb0zhme
https://coub.com/view/8bcvp8upb3
https://coub.com/view/c8p7zv5zan
https://coub.com/view/yry7la9tco
https://coub.com/view/ho2dopbp7j
https://coub.com/view/amubk2uwuc
https://coub.com/view/2jwoy1e4u4
https://coub.com/view/ezz7hv58aq
https://coub.com/view/sxb8y6f7cm
https://coub.com/view/y4kvuhob20
https://coub.com/view/t3iyg4zbk6
https://coub.com/view/hlu3q922ul
https://coub.com/view/wr5t1i5hjn
https://coub.com/view/ig12bx6jem
https://coub.com/view/elh7b4dm2v
https://coub.com/view/p3aozbkqis
https://coub.com/view/1x387gqa9h
https://coub.com/view/11vq0o0urq
https://coub.com/view/n95945i2xa
https://coub.com/view/kwxot0bqpd
https://coub.com/view/0bzsnthjf8
https://coub.com/view/l6n7cci0v1
https://coub.com/view/e33t42b2e8
https://coub.com/view/uufau92iew
https://coub.com/view/8nu2gzpi87
https://coub.com/view/bzvc0eyha5
https://coub.com/view/m7i31eulsq
Hbuilderx云打包IOS,修改manifest.json版本号无效的问题
Hbuilderx云打包应用时
云打包完成后,发现安卓版本号正常,ios却还是识别到了之前的版本号;
解决方式
1.将uni统计关了
"uniStatistics" : {
"enable" : false
}
2.将 unpackage/cache/ 目录下关于ios的删了,很可能和使用hbuilder打包出的ios本地基座有关;
暂时我是这么解决的,如果有其他根治的问题可以多留言交流
Hbuilderx云打包应用时
云打包完成后,发现安卓版本号正常,ios却还是识别到了之前的版本号;
解决方式
1.将uni统计关了
"uniStatistics" : {
"enable" : false
}
2.将 unpackage/cache/ 目录下关于ios的删了,很可能和使用hbuilder打包出的ios本地基座有关;
暂时我是这么解决的,如果有其他根治的问题可以多留言交流
收起阅读 »基于vite8+react19+electron41+antd桌面端中后台admin管理系统
基于react19+electron41+ant-design+echarts+mockjs从0-1手搓桌面端通用后台管理Exe系统。内置3种常用布局模板,支持暗黑+亮色主题,多语言/面包屑导航/tab页签,实现图表/表格/表单/列表/编辑器/错误页等常用功能。
使用技术
- 跨平台框架:electron^41.1.0
- 技术框架:react^19.2.8+react-router-dom^7.18.2
- 前端构建工具:vite^8.2.2
- 组件库:antd^6.6.3
- 状态管理:zustand^5.0.15
- 图表组件:echarts^6.1.0
- 数据模拟:axios^1.20.0+mockjs^1.1.0
- 打包工具:electron-builder^26.15.3
- 样式管理:sass^1.104.0
项目功能性
✅ 最新跨平台技术栈Electron41、React19、Vite8、Zustand5、AntDesign、Echarts
✅ 支持浅色+深色主题界面
✅ 支持中英文/繁体三种国际化语言
✅ 支持动态路由、面包屑导航、tab标签栏路由
✅ 提供3种通用布局模板、随意变换布局风格
✅ 整合常用的图表、表格、表单、列表、编辑器、错误处理等业务模块
✅ 基于electron41+react封装多开窗口管理
项目结构框架
项目入口配置
import { createRoot } from 'react-dom/client'
import './style.scss'
import App from './App.jsx'
import { launchApp } from '@/windows/actions'
launchApp().then(config => {
if(config) {
// 全局存储窗口配置
window.config = config
}
createRoot(document.getElementById('root')).render(
<App />
)
})
App.jsx主模板
import { useMemo } from 'react'
import { HashRouter } from 'react-router-dom'
import { ConfigProvider, theme, App as AntApp } from 'antd'
// 引入组件语言
import enUS from 'antd/locale/en_US'
import zhCN from 'antd/locale/zh_CN'
import zhTW from 'antd/locale/zh_TW'
// antd组件默认文案是英文,修改为中文
import dayjs from 'dayjs'
import 'dayjs/locale/zh-cn'
dayjs.locale('zh-cn')
import { ipcLoaded } from '@/windows/actions'
import { appStore } from '@/store/app'
// 引入路由配置
import Router, { AuthRouter } from './router'
function App() {
ipcLoaded()
const { lang, config: { isDark, themeColor } } = appStore()
const locale = useMemo(() => {
switch(lang) {
case 'en':
return enUS
case 'zh-CN':
return zhCN
case 'zh-TW':
return zhTW
default:
return zhCN
}
}, [lang])
return (
<ConfigProvider
// 国际化
locale={locale}
// 主题
theme={{
token: {
colorPrimary: themeColor || '#1677ff',
fontFamily: "Inter, system-ui, Avenir, Helvetica, Arial, sans-serif",
},
algorithm: isDark ? theme.darkAlgorithm : theme.defaultAlgorithm
}}
>
<AntApp>
<HashRouter>
<AuthRouter>
<Router />
</AuthRouter>
</HashRouter>
</AntApp>
</ConfigProvider>
)
}
项目布局模板
/**
* 主布局模板
* @author andy
*/
import { useMemo } from 'react'
import clsx from 'clsx'
import { appStore } from '@/store/app'
// 引入布局模板
import Columns from './template/columns'
import Vertical from './template/vertical'
import Transverse from './template/transverse'
function MainLayout() {
const { config: { skin, layout, fullContent } } = appStore()
// 布局模板
const LayoutComponent = useMemo(() => {
switch (layout) {
case 'columns':
return Columns
case 'vertical':
return Vertical
case 'transverse':
return Transverse
default:
return Columns
}
}, [layout])
return (
<div className={clsx('radmin__container', { 'is-full': fullContent })}>
<LayoutComponent />
</div>
)
}
export default MainLayout
作者:xiaoyan2017
链接:https://www.cnblogs.com/xiaoyan2017/p/22912373
来源:博客园
本文原创发布于博客园 ,转载请注明出处,谢谢合作
基于react19+electron41+ant-design+echarts+mockjs从0-1手搓桌面端通用后台管理Exe系统。内置3种常用布局模板,支持暗黑+亮色主题,多语言/面包屑导航/tab页签,实现图表/表格/表单/列表/编辑器/错误页等常用功能。
使用技术
- 跨平台框架:electron^41.1.0
- 技术框架:react^19.2.8+react-router-dom^7.18.2
- 前端构建工具:vite^8.2.2
- 组件库:antd^6.6.3
- 状态管理:zustand^5.0.15
- 图表组件:echarts^6.1.0
- 数据模拟:axios^1.20.0+mockjs^1.1.0
- 打包工具:electron-builder^26.15.3
- 样式管理:sass^1.104.0
项目功能性
✅ 最新跨平台技术栈Electron41、React19、Vite8、Zustand5、AntDesign、Echarts
✅ 支持浅色+深色主题界面
✅ 支持中英文/繁体三种国际化语言
✅ 支持动态路由、面包屑导航、tab标签栏路由
✅ 提供3种通用布局模板、随意变换布局风格
✅ 整合常用的图表、表格、表单、列表、编辑器、错误处理等业务模块
✅ 基于electron41+react封装多开窗口管理
项目结构框架
项目入口配置
import { createRoot } from 'react-dom/client'
import './style.scss'
import App from './App.jsx'
import { launchApp } from '@/windows/actions'
launchApp().then(config => {
if(config) {
// 全局存储窗口配置
window.config = config
}
createRoot(document.getElementById('root')).render(
<App />
)
})
App.jsx主模板
import { useMemo } from 'react'
import { HashRouter } from 'react-router-dom'
import { ConfigProvider, theme, App as AntApp } from 'antd'
// 引入组件语言
import enUS from 'antd/locale/en_US'
import zhCN from 'antd/locale/zh_CN'
import zhTW from 'antd/locale/zh_TW'
// antd组件默认文案是英文,修改为中文
import dayjs from 'dayjs'
import 'dayjs/locale/zh-cn'
dayjs.locale('zh-cn')
import { ipcLoaded } from '@/windows/actions'
import { appStore } from '@/store/app'
// 引入路由配置
import Router, { AuthRouter } from './router'
function App() {
ipcLoaded()
const { lang, config: { isDark, themeColor } } = appStore()
const locale = useMemo(() => {
switch(lang) {
case 'en':
return enUS
case 'zh-CN':
return zhCN
case 'zh-TW':
return zhTW
default:
return zhCN
}
}, [lang])
return (
<ConfigProvider
// 国际化
locale={locale}
// 主题
theme={{
token: {
colorPrimary: themeColor || '#1677ff',
fontFamily: "Inter, system-ui, Avenir, Helvetica, Arial, sans-serif",
},
algorithm: isDark ? theme.darkAlgorithm : theme.defaultAlgorithm
}}
>
<AntApp>
<HashRouter>
<AuthRouter>
<Router />
</AuthRouter>
</HashRouter>
</AntApp>
</ConfigProvider>
)
}
项目布局模板
/**
* 主布局模板
* @author andy
*/
import { useMemo } from 'react'
import clsx from 'clsx'
import { appStore } from '@/store/app'
// 引入布局模板
import Columns from './template/columns'
import Vertical from './template/vertical'
import Transverse from './template/transverse'
function MainLayout() {
const { config: { skin, layout, fullContent } } = appStore()
// 布局模板
const LayoutComponent = useMemo(() => {
switch (layout) {
case 'columns':
return Columns
case 'vertical':
return Vertical
case 'transverse':
return Transverse
default:
return Columns
}
}, [layout])
return (
<div className={clsx('radmin__container', { 'is-full': fullContent })}>
<LayoutComponent />
</div>
)
}
export default MainLayout
作者:xiaoyan2017
链接:https://www.cnblogs.com/xiaoyan2017/p/22912373
来源:博客园
本文原创发布于博客园 ,转载请注明出处,谢谢合作
如何解决显式动画过程中点击事件无法触发的问题
问题现象
当组件在动画执行过程中,对组件当前显示位置进行点击操作,无法触发onClick事件,唯有当动画结束、组件停止在最终位置后,该组件的点击操作才可正常响应。如何在动画执行过程中使组件能正确响应onClick事件?
@Entry
@Component
struct Problem {
@State title: string = '点击更新时间参数:';
@State x: number = 0;
startAnimation() {
this.getUIContext().animateTo({ duration: 5000, playMode: PlayMode.Normal }, () => {
this.x = 100;
});
}
build() {
Stack() {
Text(this.title)
.fontSize(18)
.position({ x: this.x, y: 40 })
.animation({
duration: 5000,
curve: Curve.Linear,
playMode: PlayMode.Normal
})
.onClick(() => {
this.title = '点击更新时间参数:' + new Date().getTime();
})
.onAppear(() => {
this.startAnimation();
});
}
.height(100)
.width('100%');
}
}
背景知识
@ohos.animator(动画):提供组件动画效果,包括定义动画、启动动画和以相反的顺序播放动画等。
显式动画(animateTo):提供全局animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。
解决方案
由于显式动画的特性,目标对象在动画执行期间所处的位置仅在动画结束时被识别和记录。当用户在动画播放过程中尝试点击该对象时,点击事件无法被正确识别和响应。
为了解决这一问题,可以采用帧动画的方式来实现,帧动画通过逐帧定义对象的状态,系统会在每一帧更新对象的位置和状态,并据此响应用户交互事件。完整示例代码参考如下:
import { AnimatorResult } from '@kit.ArkUI';
@Entry
@Component
struct SolutionOne {
@State title: string = '点击更新时间参数:';
@State x: number = 0;
private backAnimator: AnimatorResult = this.getUIContext().createAnimator({
duration: 5000,
easing: 'ease',
delay: 0,
fill: 'forwards',
direction: 'normal',
iterations: -1,
begin: 0,
end: 100
});
build() {
Stack() {
Text(this.title)
.fontSize(18)
.position({ x: this.x, y: 40 })
.onClick(() => {
this.title = '点击更新时间参数:' + new Date().getTime();
})
.onAppear(() => {
this.backAnimator.play();
this.backAnimator.onFrame = (value: number) => {
this.x = value;
};
});
}
.height(100)
.width('100%');
}
}
https://coub.com/view/x0xla7q1ai
https://coub.com/view/g1czsl0enm
https://coub.com/view/b08cx7zoe3
https://coub.com/view/bxn2yqwexg
https://coub.com/view/m9qeccobgj
https://coub.com/view/wdvoecbi4r
https://coub.com/view/x81cx0az2t
https://coub.com/view/0slfmtknp8
https://coub.com/view/2q5tc8yg66
https://coub.com/view/dt2oigt51x
https://coub.com/view/nrlgm47wti
https://coub.com/view/sp90u3ia89
https://coub.com/view/o78qotj8bn
https://coub.com/view/1duw99ytde
https://coub.com/view/wjcskrvoln
https://coub.com/view/8obmr0ccrs
https://coub.com/view/sw5f17cga5
https://coub.com/view/s1q3otk2wu
https://coub.com/view/83z3yr5cy4
https://coub.com/view/brgme2h0fi
https://coub.com/view/jkh8n5pj1b
https://coub.com/view/vode602lzv
https://coub.com/view/ue3i8rhiey
https://coub.com/view/76wrcka2m1
https://coub.com/view/casxikde15
https://coub.com/view/lb2qd32pue
https://coub.com/view/vqz0ngc7lp
https://coub.com/view/5x8wrqa4sk
https://coub.com/view/s22g4m3o4b
https://coub.com/view/a7oblam77e
https://coub.com/view/nkne5vbzgv
https://coub.com/view/92pdw2n47o
https://coub.com/view/wi0fyfnyj6
https://coub.com/view/lrcrn6sklh
https://coub.com/view/ty636zpx1j
https://coub.com/view/1p4s8n800f
https://coub.com/view/2ewu7lqpse
https://coub.com/view/ees1i4x52y
https://coub.com/view/esuw3humxk
https://coub.com/view/ttof5yluqt
https://coub.com/view/3788oh5mhd
https://coub.com/view/zprnnzdm9y
https://coub.com/view/1758nsm1bp
https://coub.com/view/85robtp98p
https://coub.com/view/pwhyjoe2qk
https://coub.com/view/fk76ykwiph
https://coub.com/view/2qpw8qa4v6
https://coub.com/view/qmich3xb6k
https://coub.com/view/0fpkrydd0k
https://coub.com/view/bvzgv7jbfc
https://coub.com/view/nvjqk9hmiz
https://coub.com/view/0le4asq8nh
https://coub.com/view/rkrsrwn90s
https://coub.com/view/f2uu2z8u1s
https://coub.com/view/715y2xacjj
https://coub.com/view/6v5dzfjzbn
https://coub.com/view/wxk5a8mxbn
https://coub.com/view/o05ggpa1bk
https://coub.com/view/v04o0y81aa
https://coub.com/view/e0fsub9p1f
https://coub.com/view/tkv88d5t0f
https://coub.com/view/xz6i7n2qay
https://coub.com/view/d211sbq00l
https://coub.com/view/zypkg0eyho
https://coub.com/view/8r0gx25nyg
https://coub.com/view/63tzntskz6
https://coub.com/view/3jsg85l39s
https://coub.com/view/hr4idq4466
https://coub.com/view/h4drvxmmmt
https://coub.com/view/schlv1biel
https://coub.com/view/f4uuetk2yf
https://coub.com/view/m2z1rd0e4k
https://coub.com/view/s94flprsy0
https://coub.com/view/smusvxthpl
https://coub.com/view/p0qj7yhx1p
https://coub.com/view/5ahyecg1hb
https://coub.com/view/hgbpl5bpg1
https://coub.com/view/0xmq3ond07
https://coub.com/view/zf7r0w2yyb
https://coub.com/view/bd0elp9k2p
问题现象
当组件在动画执行过程中,对组件当前显示位置进行点击操作,无法触发onClick事件,唯有当动画结束、组件停止在最终位置后,该组件的点击操作才可正常响应。如何在动画执行过程中使组件能正确响应onClick事件?
@Entry
@Component
struct Problem {
@State title: string = '点击更新时间参数:';
@State x: number = 0;
startAnimation() {
this.getUIContext().animateTo({ duration: 5000, playMode: PlayMode.Normal }, () => {
this.x = 100;
});
}
build() {
Stack() {
Text(this.title)
.fontSize(18)
.position({ x: this.x, y: 40 })
.animation({
duration: 5000,
curve: Curve.Linear,
playMode: PlayMode.Normal
})
.onClick(() => {
this.title = '点击更新时间参数:' + new Date().getTime();
})
.onAppear(() => {
this.startAnimation();
});
}
.height(100)
.width('100%');
}
}
背景知识
@ohos.animator(动画):提供组件动画效果,包括定义动画、启动动画和以相反的顺序播放动画等。
显式动画(animateTo):提供全局animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。
解决方案
由于显式动画的特性,目标对象在动画执行期间所处的位置仅在动画结束时被识别和记录。当用户在动画播放过程中尝试点击该对象时,点击事件无法被正确识别和响应。
为了解决这一问题,可以采用帧动画的方式来实现,帧动画通过逐帧定义对象的状态,系统会在每一帧更新对象的位置和状态,并据此响应用户交互事件。完整示例代码参考如下:
import { AnimatorResult } from '@kit.ArkUI';
@Entry
@Component
struct SolutionOne {
@State title: string = '点击更新时间参数:';
@State x: number = 0;
private backAnimator: AnimatorResult = this.getUIContext().createAnimator({
duration: 5000,
easing: 'ease',
delay: 0,
fill: 'forwards',
direction: 'normal',
iterations: -1,
begin: 0,
end: 100
});
build() {
Stack() {
Text(this.title)
.fontSize(18)
.position({ x: this.x, y: 40 })
.onClick(() => {
this.title = '点击更新时间参数:' + new Date().getTime();
})
.onAppear(() => {
this.backAnimator.play();
this.backAnimator.onFrame = (value: number) => {
this.x = value;
};
});
}
.height(100)
.width('100%');
}
}
https://coub.com/view/x0xla7q1ai
https://coub.com/view/g1czsl0enm
https://coub.com/view/b08cx7zoe3
https://coub.com/view/bxn2yqwexg
https://coub.com/view/m9qeccobgj
https://coub.com/view/wdvoecbi4r
https://coub.com/view/x81cx0az2t
https://coub.com/view/0slfmtknp8
https://coub.com/view/2q5tc8yg66
https://coub.com/view/dt2oigt51x
https://coub.com/view/nrlgm47wti
https://coub.com/view/sp90u3ia89
https://coub.com/view/o78qotj8bn
https://coub.com/view/1duw99ytde
https://coub.com/view/wjcskrvoln
https://coub.com/view/8obmr0ccrs
https://coub.com/view/sw5f17cga5
https://coub.com/view/s1q3otk2wu
https://coub.com/view/83z3yr5cy4
https://coub.com/view/brgme2h0fi
https://coub.com/view/jkh8n5pj1b
https://coub.com/view/vode602lzv
https://coub.com/view/ue3i8rhiey
https://coub.com/view/76wrcka2m1
https://coub.com/view/casxikde15
https://coub.com/view/lb2qd32pue
https://coub.com/view/vqz0ngc7lp
https://coub.com/view/5x8wrqa4sk
https://coub.com/view/s22g4m3o4b
https://coub.com/view/a7oblam77e
https://coub.com/view/nkne5vbzgv
https://coub.com/view/92pdw2n47o
https://coub.com/view/wi0fyfnyj6
https://coub.com/view/lrcrn6sklh
https://coub.com/view/ty636zpx1j
https://coub.com/view/1p4s8n800f
https://coub.com/view/2ewu7lqpse
https://coub.com/view/ees1i4x52y
https://coub.com/view/esuw3humxk
https://coub.com/view/ttof5yluqt
https://coub.com/view/3788oh5mhd
https://coub.com/view/zprnnzdm9y
https://coub.com/view/1758nsm1bp
https://coub.com/view/85robtp98p
https://coub.com/view/pwhyjoe2qk
https://coub.com/view/fk76ykwiph
https://coub.com/view/2qpw8qa4v6
https://coub.com/view/qmich3xb6k
https://coub.com/view/0fpkrydd0k
https://coub.com/view/bvzgv7jbfc
https://coub.com/view/nvjqk9hmiz
https://coub.com/view/0le4asq8nh
https://coub.com/view/rkrsrwn90s
https://coub.com/view/f2uu2z8u1s
https://coub.com/view/715y2xacjj
https://coub.com/view/6v5dzfjzbn
https://coub.com/view/wxk5a8mxbn
https://coub.com/view/o05ggpa1bk
https://coub.com/view/v04o0y81aa
https://coub.com/view/e0fsub9p1f
https://coub.com/view/tkv88d5t0f
https://coub.com/view/xz6i7n2qay
https://coub.com/view/d211sbq00l
https://coub.com/view/zypkg0eyho
https://coub.com/view/8r0gx25nyg
https://coub.com/view/63tzntskz6
https://coub.com/view/3jsg85l39s
https://coub.com/view/hr4idq4466
https://coub.com/view/h4drvxmmmt
https://coub.com/view/schlv1biel
https://coub.com/view/f4uuetk2yf
https://coub.com/view/m2z1rd0e4k
https://coub.com/view/s94flprsy0
https://coub.com/view/smusvxthpl
https://coub.com/view/p0qj7yhx1p
https://coub.com/view/5ahyecg1hb
https://coub.com/view/hgbpl5bpg1
https://coub.com/view/0xmq3ond07
https://coub.com/view/zf7r0w2yyb
https://coub.com/view/bd0elp9k2p
























