首页

AIGC产品的设计原则

博博

一、AI产品形态介绍

不同的产品所具备的AI能力以及用户的使用方式都是截然不同的。从产品功能的角度,产品大致可以分为三类:辅助驾驶型、内容生产型、自主决策型。

辅助驾驶型

Copilot 辅助驾驶型如其名,更强调AI的辅助性。AI会针对某个模块辅助用户做出决策,或者基于用户的操作而操作,从而帮助用户实现自己灵感的落地,类似在成熟软件中的插件功能。微软的Microsoft 365 Copilot 结合在已有的Word、Excel工具当中,用户仍然可以自己书写文章或表格,但也能随时唤起AI工具进行编辑,对于已有的文件进行汇总、扩写等编辑操作。

内容生产型

内容生产型是需要调用LLM的API来实现某一具体内容的功能性产品。用户需要针对具体场景下达相对详细、明确的指令后,AI会生成内容结果的反馈。比如大家熟悉的midjourney,用户下达具体的内容场景描述,midhourney会返回图片生成的结果。

自主决策型

AI Agent可以进行自主决策和执行任务,它可以通过独立思考和调用工具逐步完成给定的目标,无需人类去指定每一步的操作。比如,告诉 AI Agent 帮忙下单一份外卖,它就可以直接调用 APP 选择外卖,再调用支付程序下单支付,无需用户去指定每一步的操作。

二、AIGC产品设计原则

在AI产品的设计过程当中,针对不同的产品形态、用户场景、用户心智需要明确其设计原则。当前用户对于AI工具的预期是:高性能、快速、高效和可靠。从用户体验上来说,用户与AI产品的交互方式、对于AI产品的信任程度都有别于其他软件。我们需要在各个环节上,制定好AI产品的能力范畴,管理好用户对产品的预期,为AI产品提供一个友好、可拓展的交互架构。

原则1:让用户明确知道产品的能力范围

在产品推出之前,清晰地定义产品的能力和限制。不要过度夸大产品的功能或过度承诺,而是诚实地描述产品的真实能力。给予用户在使用产品前充足的心理预期,用户可以清晰的了解产品的能力范围。更好地管控用户心理预期的同时,也可以向用户传递产品的能力点。
 
如小库科技详细描述了产品可以应用的功能场景,用户对于场景化的词语可以有更好的关联联想,对于产品的能力也有更好的边界认知。
 
科大讯飞也通过具体的场景化进行产品功能的传递
 
在Liblib的模型广场中,会将用户生产的结果、模型以社区成果的形式进行展示,用户可以查看详细的生成参数进行尝试,对于新手用户也可以起到很好的内容引导。

原则2:让用户可预期结果

人工智能决策的透明度对用户至关重要,使用可视化工具、交互或解释性语言让用户能够理解AI是如何做出决策。如小库AI,在“描述词”的提示文案中告知用户输入词的限定以及预期的生成结果,并可以通过词库告知用户可以输入哪些类型的词。
 
如酷家乐AI,用户在首次使用AI工具,没有灵感或想法的时候,引导并提示用户可上传的素材类型,让用户可以有更好的目标预期。

原则3:建立与用户共建产品的机制

积极邀请用户参与产品的设计和改进过程,通过用户调研、用户测试和用户反馈机制,了解用户的期望和需求,并将其纳入到产品的迭代和改进中。如在Discord社区当中,用户可以在官网的反馈入口找到期望反馈的内容板块,可以进行问题帖子的反馈,所有的用户群体可以对帖子的内容进行投票支持和评论。也就是相当于以社区共建的形式,让所有的用户都可以对产品进行共建维护。如果是产品功能本身的问题,开发人员可以及时响应;如果是用户自身对产品的认知问题,社区的小伙伴也可以进行很好的解答。

原则4:减轻用户对数据隐私安全的顾虑

在AI盛行的当下,数据隐私安全可以说是非常敏感的话题了,AI泄漏数据隐私的事件也在不断曝光。妙鸭相机的爆红事件给我们的警示是在产品设计的过程中,除了思考如何利用新技术产出新的创意,对用户数据隐私安全的保护同样重要,它是产品获得用户信任,得以被持续使用的原因之一。
数据隐私安全涵盖的范围是非常广泛的。从产品设计的角度来看对于数据隐私安全的保护可以从以下几点考虑:

1、政策和规范的跟进和了解

遵守数据隐私和安全相关的法律法规和标准对于产品和应用是最基础的。在国内,7月网信办等7部委联合公布了《生成式人工智能服务管理暂行办法》,生成式人工智能服务管理办法的正式落地为我国AI发展打下了基础。

2、积极告知,将决策权还给用户

积极告知用户产品如何保护数据隐私安全也是规避风险的一种方法。比如用户协议中对于用户隐私的处理,比起直接提供给用户大段的文案让他们去逐字查看,在操作流程中说明产品对于用户隐私的使用,并让用户进行手动确认会明显提高用户对于产品的信任程度。苹果在数据隐私安全方面始终站在了用户这一边,无论是安装应用时询问权限还是每次出现的“是否允许粘贴”,其对于隐私保护的方法与措施都值得我们学习。

3、本地存储也是一种选择

Rewind工具可以自动存储用户在自己电脑和手机上看到的所有内容,通过引入“私人助理”的角色,方便用户基于AI进行内容的搜索和浏览整合。工具对于用户隐私的处理也非常值得参考,其主要通过本地存储、内容随时可删除等方法,让隐私优先的原则贯穿在产品的定位和功能设计之中,也是这款工具能够获得好评的原因之一。

三、结语

总的来说,AI技术的推广目前仍面临相当大的挑战,对于大众而言也有一定的使用门槛。作为设计师,比起强调产品能力的升级,我们更应该注重对用户的关怀,一款好的AI产品必定是智能化且人性化的。AI技术下的人机交互应用已经成为UX设计的趋势,我们需要注意平衡技术和用户体验之间的关系,以确保我们的设计在满足用户需求的基础之上,能够助力产品在商业市场上的成功。

 

蓝蓝设计(www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的大数据可视化界面设计、B端界面设计、桌面端界面设计、APP界面设计、图标定制、用户体验设计、交互设计、UI咨询、高端网站设计、平面设计,以及相关的软件开发服务,咨询电话:01063334945。

关键词:UI咨询、UI设计服务公司、软件界面设计公司、界面设计公司、UI设计公司、UI交互设计公司、数据可视化设计公司、用户体验公司、高端网站设计公司

银行金融软件UI界面设计、能源及监控软件UI界面设计、气象行业UI界面设计、轨道交通界面设计、地理信息系统GIS UI界面设计、航天军工软件UI界面设计、医疗行业软件UI界面设计、教育行业软件UI界面设计、企业信息化UI界面设计、软件qt开发、软件wpf开发、软件vue开发

UI设计师未来的出路在哪?

涛涛

首先,随着移动互联网的普及和技术的不断发展,UI设计师的职业发展路径将更加广泛和多样化

UI设计通过哪些方面赋能产品?

涛涛

UI设计在赋能产品方面具有重要作用。通过提升用户体验、增强品牌识别度、优化信息架构、促进交互操作、提高可定制性、降低学习成本以及传递情感价值等方面,UI设计可以帮助产品更好地满足用户需求,提升产品的竞争力。

 

如何对老板或客户讲述自己的UI设计方案?

涛涛

对用户讲解自己的UI设计方案时,需要将专业术语转化为用户易于理解的语言,并着重强调设计方案如何提升用户体验。

如何确认UI设计的设计风格?

涛涛

确认UI设计的设计风格需要综合考虑主色调选择、产品特性分析、图标和字体选择、排版设计、品牌识别、用户需求和习惯、设计的一致性、简洁与清晰以及创新性等方面。通过这些方面的考虑和应用,可以设计出符合品牌形象、用户期望和产品特点的优秀UI界面。

自然语言界面:开启人机交互的全新篇章

博博

作者:山中

人机交互界面经过几十年的发展,人与机器间的交互变得越来越容易,随着ChatGPT等大语言模型的出现,一种我们既熟悉又陌生的交互方式再次进入大众视野,它就是自然语言界面(NLI)。

那么什么是自然语言界面,它又会为人机交互带来哪些新的变化,它会成为下一代主流的用户界面吗?本文将从计算机UI的发展简史出发,对比自然语言界面与传统图形界面的差异,带你了解自然语言界面的应用场景和发展方向。

一、计算机UI发展简史

首先让我们回顾一下过去几十年计算机UI的发展阶段。

1、穿孔纸带(Punched tape)

1940-1960年代,早期的计算机通过穿孔纸向计算机输入指令,带孔为1,无孔为0,经过光电输入机将数据输入计算机。由于需要输入二进制的机器语言,计算机在这个阶段只被少数专家应用于专业领域。

 

2、命令行界面(CLI)

20世纪60年代中期,命令行界面( CLI )作为穿孔纸带的友好替代方案出现在计算机上。命令行界面是一种通过输入被称为命令行的文本行与计算机程序交互的方法,虽然它与人类语言有较大差异,但还是大幅降低了计算机的使用门槛,个人计算机(PC)随之出现。

 

3、图形用户界面(GUI)

命令行界面通常需要用户记忆操作的命令,这对于普通用户仍然是很困难的。GUI的出现正是为了解决这个问题:既然人类很难记住各种命令,那就让机器提供可能的选项,人类只需要通过图形元素进行选择。最早的图像界面出现在1970年代,随后苹果和微软让GUI普及,短短二三十年,使用GUI交互的计算机和各类消费电子产品已经成为我们工作生活中不可缺少的一部分。

 

 

二、自然语言界面(NLI)的爆发

什么是自然语言界面?

W3C是这样定义的:自然语言界面是用户与系统通过自然语言进行通信的用户界面。用户通过语音或某种其他方法提供输入,并且系统以通过语音、文本或某种其他方法传递的话语的形式生成响应。

自然语言界面是什么时候出现的?

最早的自然语言界面可以追溯到 20 世纪 60 年代。ELIZA是一个早期的自然语言处理计算机程序,由麻省理工学院的Joseph Weizenbaum教授于1964 年至 1967 年开发,旨在探索人类和机器之间的沟通方法。ELIZA 通过模式匹配和替换来模拟对话,也就是说它通过检测用户输入的内容中是否包含某些关键词来做出响应,虽然它能做出的反应有限,更不能真正理解人类的语言,但这是人类第一次尝试通过自然语言进行人机交互,也是后续自然语言处理(NLP)技术研究的一个里程碑

 

语音用户界面(VUI)

自然语言处理(NLP)技术经过几十年的发展,终于在2010年代迎来第一波应用爆发。2011年 Siri 作为 iOS 功能由 Apple 发布,随后各家手机语音助手、智能音箱等VUI产品纷纷出现。但随之出现了一个新的网络名词-“人工智障”。虽然 Siri 相比 ELIZA 能做的事情更多了,但它们在体验上仍没有本质区别,Siri等产品依然需要用户遵循特定的表述方式才能做出正确响应,可能换一个表述方式它们就听不懂了,所以这个阶段的自然语言界面更多是作为一种辅助交互方式

 

大语言模型(LLM)

ChatGPT 于2022年底开放测试,不到一年时间大语言模型(LLM)与AIGC应用已经遍地开花。大语言模型实现了NLP技术的阶段性跨越,AI对自然语言的理解能力大幅提升,不仅能模仿人类对话,还具备文案写作和问题分析等能力,并且这些能力还在飞速进步中,相信自然语言界面即将迎来第二次应用爆发。

 

三、自然语言界面的优势

那么,自然语言界面相比传统图形界面又有什么优势呢?

1、低门槛

刻在我们DNA里的交互方式

语言是我们与他人交互的主要“界面”,智人的言语出现于 50,000 至 200 万年前,所以说这是刻在我们DNA里的交互方式。我们从小就学习阅读、写作和说话,因此通过自然语言界面与计算机交互几乎不需要学习

 

2、高效率

GUI的思路是机器提供可能的选项,让人类进行选择。但复杂产品可能有几百上千个选项,即便设计师努力按照最合理的逻辑整理、收纳这些选项,用户仍需要花大量时间精力寻找、理解、记忆这些选项。

酷家乐用户问题

酷家乐用户联系客服的问题中较多是工具使用问题:怎么添加门把手、怎么把门翻转、怎么显示柜体尺寸。在几十上百个功能中找到那一个功能都如此困难,对于需要用到多个“选项”组合操作才能实现的效果,那确实难以要求普通用户做到。

 

但如果酷家乐支持自然语言交互,我只需要告诉它我们的诉求:“添加门把手”、“把门翻转”、”显示柜体尺寸“,软件便会直接实现这些的效果。

通过自然语言输入,用户便可以忘记各家软件各种复杂的交互逻辑,设计师也无需煞费苦心设计复杂的用户引导和帮助系统,随之客服人力成本也将大幅降低。

Tome

目前已经有一些产品在这么做了,Tome是一款制作提案PPT的产品,它可以通过自然语言输入实现大部分操作,并且支持AI直接生成内容。

 

3、不设限

早期计算机的输入输出完全靠机器语言,门槛很高。后来,普通用户借助图形界面和开发好的程序,也能轻松使用计算机,但同时我们也被其限制了。

美间站点

以”美间“为例,美间站点有大量的海报模板,可以按用途、风格维度进行筛选,但用户也只能按这两个维度筛选。如果我想找出10月份用户点击最高的10个节气海报模板,那对不起,办不到,不是因为我们没有这个数据,而是我们没有提供个“选项”,通过SQL或者其他语言查询数据库就可以获取到。

 

但如果美间的数据库接入了大语言模型,那么直接问它,就能得到任何数据库能提供的内容,因为现在LLM已经会自己写代码做数据分析工作了。通过自然语言界面,我们可以最大程度发挥计算机和数据库的价值。

 

四、自然语言会不会取代图形界面?

自然语言界面这么强大,那它会不会取代图形界面呢?答案是不会,受限于AI能力发展现状和自然语言自身的局限性,自然语言界面有其适用范围

1、AI能力仍有限

理想情况是AI能完全理解我们的诉求、且能力能够覆盖,但现在还做不到。用户随便输入一个需求,产品很可能做不到,这就需要我们通过GUI进行提示和引导。

 

2、额外的处理时间

相比通过GUI直接对程序发出指令,用户输入自然语言LLM普遍需要几秒钟的处理时间,带来更高的试错成本,某些场景下我们使用GUI操作更加快捷。

 

3、自然语言表达不够精准

人与人的交流也常常存在歧义,更别说跟机器交流了,所以自然语言界面不适合做非常精细的操作。 

美间提案PPT

以美间提案PPT为例,如果我通过自然语言输入:“把标题改成红色”,那AI可能会反问:”哪个标题?哪种红色?“。试想一下,如果要通过自然语言描述这些信息,是不是还不如通过鼠标选择来的简单。

 

4、自然语言输入也存在成本

自然语言输入,用户需要把需求组织成语言,然后打字或讲出。也就是说用户需要动脑子,这显然与我们追求的”Dot let me think“原则相违背

美间海报

以美间海报场景为例,美间支持”AI生成“和”模板再创作“两种海报创作方式。这两种方式分别有各自的使用场景。如果用户需要一张元旦祝福海报,对于目标明确的用户,他可以通过详细描述画面需求,生成个性化的海报方案。例如:”生成一张元旦节日海报,主题为:群核科技祝您元旦快乐,画面要喜庆,插画风格,包含烟花、灯笼、热闹的人群等元素“

 

但对于更多用户来说,描述一个海报画面是困难的,大部分用户只需要一个通用的模板改改字就足够了,这样不但更轻松,而且得到的海报质量也更高。

 

五、NLI与GUI融合互补

所以,自然语言界面不会取代图形界面,它们更多会融合互补,在各自的擅长领域发光发热。

 

未来常见的用户工作流将会是:NLI发散-GUI收敛,先使用NLI得到一个大概结果,再通过GUI完成确认或调整。

美间AI海报

美间AI海报就是这样的设计思路:基于自然语言输入生成若干结果,选择一个满意的方案再二次编辑。

 

六、NLI还有哪些应用场景?

自然语言界面还有哪些应用场景?微软表示:万物皆可“Copilot”

Copilot是微软发布的依托于大语音模型的AI助手(AI Agent)。11月15日的微软Ignite大会上,CEO纳德拉向我们展示了Copilot最新的形态:一个入口连接无限可能

Copilot可以连接各种应用和数据源,用户只需要把需求告诉Copilot,Copilot就能自动完成全部应用和数据操作,甚至是跨应用和跨数据源的。

Copilot Studio

Copilot Studio是微软面向B端用户推出的AI助手,支持用户自定义专属的Copilot,以满足行业、部门、角色等内外部场景的定制化需求。让Copilot链接企业财务系统,你可以随时问它各类财务预算的开支和剩余情况;Copilot还能双向打通CRM、ERP等SAAS产品,自动化执行复杂的业务流程,比如办理新员工入职、费用报销等。

 

数据分析

Excel拥有强大的数据分析能力,但我们大部分人只用过Excel来制作表格,因为高阶的函数、宏等功能对于普通用户来说学习成本太高。现在,Copilot与Excel结合,便可以实现通过自然语言写代码执行复杂的数据分析工作。

 

AIGC

AIGC是当前最热门的AI应用领域之一,除了常见的文案生成、图片生成,传统的内容创作软件结合AIGC能力也可以发挥出巨大的潜力。Copilot加持下的PPT,只需一句话,Copilot将自动帮你完成PPT的文案、配图、排版等工作。

 

七、展望

未来自然语言界面将重塑现有产品的交互方式, 但自然语言也只是一种交互方式,未来随着AI能力和硬件技术的发展,人类与机器间的交互成本还将进一步降低。

微软在Ignite大会上演示了未来 AI+MR 设备的应用场景,借助MR设备AI可以看到、听到、解释、理解我们的意图和我们周围的世界,我们只需要极少的输入就能得到需要的结果。以现在AI技术的发展速度,相信这些看似科幻电影中的场景用不了多久便会成为现实。

蓝蓝设计(www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的大数据可视化界面设计B端界面设计桌面端界面设计APP界面设计图标定制用户体验设计交互设计UI咨询高端网站设计平面设计,以及相关的软件开发服务,咨询电话:01063334945。

关键词:UI咨询UI设计服务公司软件界面设计公司、界面设计公司、UI设计公司UI交互设计公司数据可视化设计公司用户体验公司高端网站设计公司

银行金融软件UI界面设计能源及监控软件UI界面设计气象行业UI界面设计轨道交通界面设计地理信息系统GIS UI界面设计航天军工软件UI界面设计医疗行业软件UI界面设计教育行业软件UI界面设计企业信息化UI界面设计、软件qt开发软件wpf开发软件vue开发

 

ui表单验证问题

前端达人

首先展示正确的格式(以验证是否为空为例):

html代码块:

 
  1.  
    <el-form :model="nodeName(数组名)" ref="nodeName(数组名)">
  2.  
    <el-form-item prop="name(数组内的属性)" label="内容:" :rules="[{ required: true, message: '不能为空'}]">
  3.  
    <el-input type="name(数组内的属性)" v-model="nodeName.name(数组内的属性)"></el-input>
  4.  
    </el-form-item>
  5.  
    </el-form>
 

js代码块:

 
  1.  
    data(){
  2.  
    return{
  3.  
    // 表单
  4.  
    nodeName:{
  5.  
    name:''
  6.  
    }
  7.  
    }
  8.  
    },
 

前端展示(输入内容后显示为空消失):

 

 

下面开始总结常见的问题以及功能失效的原因.


1. input左侧出现星号,内容为空却不提醒

 

原因:已经写好了验证功能,但是没有绑定到input框 .

解决方法:是<el-form-item>标签加入prop="数组内要验证的属性"或者<el-input>标签中加入type="数组内要验证的属性".

2.input框里已经有内容,但还是显示不能为空

 

(一)原因:input有数据,但是表单没有验证到.

解决方法:给<el-form>绑定整个数组.v-model="newName".

(二)原因:表单验证绑定的不是数组,只是一个单纯的ojbect或者number或者char类型

 如此种情况,无论输入什么都会提示为空.

解决方法:将绑定验证内容变成数组【也可以把表单验证写在data里面】

 

 

[表单验证只能绑定数组,如果单纯绑定一个数值,会出现验证不到的现象发生]!!!!!!!!!

3.提交表单按钮无法验证以及符合验证的表单内容,也就是提交失败.

此情况一般报错为两个:

 

 Element-ui官方样式表单提交函数功能是这样展示的:

 
  1.  
    newNameBtn(newName) {
  2.  
    this.$refs[newName].validate((valid) => {
  3.  
    if (valid) {
  4.  
    alert('submit!');
  5.  
    } else {
  6.  
    console.log('error submit!!');
  7.  
    return false;
  8.  
    }
  9.  
    });
  10.  
    },
 

 我们可以看到方法是this.$refs[数组名].validate(() =>{})或者this.$refs.数组名.validate(() =>{})这样一个函数.

如果你用的html5或者是其他不显示参数的集成工具,代码是这样的:

 

 并不知道这个this.$refs有没有真正的请求到,如果你用的显示参数的集成工具(如phpstorm),如果你的代码正确,会这样显示:

 

 我们看到会多显示一个callback,这就说明this.$refs生效了.

所以不管你使用说明软件写的代码,如果出现表单验证提交错误.也就是现实开头那两个错误.你就先输入console.log(this.$ref.newName)[此处的newName是你自己绑定的数组]

看看输出是一个对象还是undefine.显示这个对象说明this.$refs.newName请求成功.

 

如果显示undefine,可以这样改正:

(一)你的代码格式书写错误,请比照上文有红箭头的图正确案例改正格式.

(二)你的<el-form>未绑定ref,请给<el-form>标签绑定ref="newName"[此处的newName是你自己绑定的数组]

 

出现表单验证错误先比对案例 ,然后再按照自己的具体代码绑定自己的数据.

[注:Element-ui的表单验证一定是绑定的数组类型]

 

分享此文一切功德,皆悉回向给文章原作者及众读者.

免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

 

 

蓝蓝设计(www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的大数据可视化界面设计B端界面设计桌面端界面设计APP界面设计图标定制用户体验设计交互设计UI咨询高端网站设计平面设计,以及相关的软件开发服务,咨询电话:01063334945。

关键词:UI咨询UI设计服务公司软件界面设计公司、界面设计公司、UI设计公司UI交互设计公司数据可视化设计公司用户体验公司高端网站设计公司

银行金融软件UI界面设计能源及监控软件UI界面设计气象行业UI界面设计轨道交通界面设计地理信息系统GIS UI界面设计航天军工软件UI界面设计医疗行业软件UI界面设计教育行业软件UI界面设计企业信息化UI界面设计、软件qt开发软件wpf开发软件vue开发

 

js判断屏幕分辨率的代码

前端达人

一般我们可以通过下面的代码判断分辨率

复制代码 代码如下:
<script language="JavaScript">
<!-- Begin
function redirectPage() {
var wjb51=screen.width;
var hjb51=screen.height;
alert("经系统检测,你的屏幕分辨率为 " + wjb51+"*"+ hjb51 + "by 脚本之家17jquery.com");
}
// End -->
</script>

js判断浏览器分辨率

复制代码 代码如下:
<script>
function ScreenWidth(){
if (screen.width == 1440){
alert("1440*900");
}else if (screen.width == 800){
alert("800*600");
}else if (screen.width == 1152){
alert("1152*864");
}else {
alert("do not know!");
}
}
</script>
<input type="button" name="" value="fenbianli " οnclick=" ScreenWidth()"/>
内容来自17jquery

说明:这段js代码可改造一下,改为screen.width>=1024 screen.width=800两种情况

所以我选择使用下面的代码:

复制代码 代码如下:
if(screen.width>=1440){
alert('宽屏幕可以加载广告了');
//一些广告代码
}

用JS判断不同分辨率调用不同的CSS样式文件

最近看一个网站,发现显示器不同的分辨率,样式文件调用的也不一样,今天写了一个例子研究一下,
复制代码 代码如下:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<link rel="stylesheet" id="sc" type="text/css" href="css/c1.css"/>
<script type="text/javascript">
window.οnlοad=function(){
var sc=document.getElementById("sc");
var d=document.getElementById("d");
if(screen.width>1024) //获取屏幕的的宽度
{
sc.setAttribute("href","css/c2.css"); //设置css引入样式表的路径
d.innerHTML = "你的电脑屏幕宽度大于1024,我的宽度是 1200px, 背景色现在是红色。";
}
else{

sc.setAttribute("href","css/c1.css"); 17jquery.com
d.innerHTML = "你的电脑屏幕宽度小于或是等于1024,我的宽度是 960px, 背景色现在是蓝色。";
}
}
</script>
</head>
<body>
<div id="d"></div>
</body>
</html>

c1.css里面的内容

复制代码 代码如下:
*{ margin:0; padding:0;}

div{ width:960px; height:400px; margin:0 auto; background:blue; color:#ffffff;}


c2.css里面的内容

*{ margin:0; padding:0;}

div{ width:1200px; height:400px; margin:0 auto; background:red; color:#fff;}

 

分享此文一切功德,皆悉回向给文章原作者及众读者.

免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

 

蓝蓝设计(www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的大数据可视化界面设计B端界面设计桌面端界面设计APP界面设计图标定制用户体验设计交互设计UI咨询高端网站设计平面设计,以及相关的软件开发服务,咨询电话:01063334945。

关键词:UI咨询UI设计服务公司软件界面设计公司、界面设计公司、UI设计公司UI交互设计公司数据可视化设计公司用户体验公司高端网站设计公司

银行金融软件UI界面设计能源及监控软件UI界面设计气象行业UI界面设计轨道交通界面设计地理信息系统GIS UI界面设计航天军工软件UI界面设计医疗行业软件UI界面设计教育行业软件UI界面设计企业信息化UI界面设计、软件qt开发软件wpf开发软件vue开发

 

小小的细节大大的体验

博博

小小的细节大大的体验

Vue新建项目+git托管+初始配置+项目打包优化

前端达人

1、已全局安装vue-cli和nodejs(第一次需要)

2、利用Vue-cli创建项目

  • 打开项目所在文件夹
  • vue create ‘项目名’
  • 选择手动配置

babel:js编辑器
typeScript:超集js【需要指定数据类型】
PWA:离线可用
Linter/Formatter:约束代码规范,配合eslint
unit/e2e testing:测试
在这里插入图片描述
在这里插入图片描述

3、git远程仓库初始化(创建并添加公钥,配一次即可)

4、本地项目托管

  • 新建仓库,给仓库命名即可,无任何勾选
  • 第二次新建仓库,不需要再git全局设置
  • 已经创建了项目,进入vscode终端(管理员)(or cmd进入项目路径)
  • git init
  • 执行橙色代码(第一句表示远程仓库地址,第二句表示首次推送主分支到云端仓库,origin为云仓库别名)

在这里插入图片描述

5、项目文件夹

node_modules:放置项目依赖的地方
public:一般放置一些共用的静态资源,包括页签图标、index.html,打包上线的时候,public文件夹里面资源原封不动打包到dist文件夹里面;<%= BASE_URL %>是public所在路径,使用绝对路径

脚手架目录public和assets区别:参考链接
在这里插入图片描述

src:程序员源代码文件夹

  • assets文件夹:经常放置一些静态资源(图片),assets文件夹里面资源webpack会进行打包为一个模块(js文件夹里面)
  • components文件夹:一般放置非路由组件(或者项目共用的组件)
  • App.vue 唯一的根组件
  • main.js 入口文件【程序最先执行的文件】
  • babel.config.js:babel配置文件【翻译官:如ES6翻译成ES5,兼容好】
  • package.json:应用包配置文件;看到项目描述、项目依赖、项目运行指令【项目信息记录:‘项目身份证’】
  • package-lock.json: 包版本控制文件
  • .gitignore: git版本管制忽略的配置
  • README.md:项目说明文件

补充:通过 vue.config.js 可以修改 webpack 的默认配置
在这里插入图片描述

6、初始配置

a. 浏览器自动打开html,vue-cli-service serve --open

package.json文件中
        "scripts": {
         "serve": "vue-cli-service serve --open",
          "build": "vue-cli-service build",
          "lint": "vue-cli-service lint"
        },
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

b.关闭eslint校验工具

创建vue.config.js文件:需要对外暴露
module.exports = {
   lintOnSave:false,
}
  • 1
  • 2
  • 3
  • 4

c. src文件夹的别名的设置 【@表示src文件夹,@在"node_modules","dist"不能用】

创建jsconfig.json文件
{
    "compilerOptions": {
        "baseUrl": "./",
        "paths": {
            "@/*": [
                "src/*"
            ]
        }
    },
    "exclude": [
        "node_modules",
        "dist"
    ]
}

 

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

7、后台项目的环境安装配置;参考黑马项目

  • MySQL数据库;
  • Node.js环境【因为后台接口依赖Node.js】 Nodejs安装及环境配置链接
  • 安装API依赖包;
  • postman测试后台项目接口:【安装与使用见连接】
    https://blog.csdn.net/m0_61843874/article/details/123324727
    https://www.bilibili.com/video/BV1hP4y177gS/?spm_id_from=333.337.search-card.all.click&vd_source=c4d71976fd97f04545873bc4552dfb71
    选择好请求方式;输入URL;body——x-www-form-urlencoded(普通形式输入请求参数)

8、清除初始静态样式,梳理app.vue根组件在这里插入图片描述

9、清除初始路由配置;清除初始的路由组件和非路由组件

新建routes.js放路由规则在这里插入图片描述

10、生成项目报告

npm run build  -- --report
  • 1

11、项目优化

  1. Vue项目在执行build命令期间中移除所有console.log 链接
  2. 通过 vue.config.js 可以修改 webpack 的默认配置
    在这里插入图片描述
  3. 为开发模式与发布模式指定不同的打包入口
    在这里插入图片描述
    3.1 打包入口的修改,可以通过 configureWebpack和 chainWebpack节点来实现:
    在这里插入图片描述
    3.2 通过 chainWebpack 自定义打包入口
    新建./src/main-prod.js和./src/main-dev.js文件;在vue.config.js进行如下配置
chainWebpack: config => {
    config.when(process.env.NODE_ENV === 'production',config=>{
      config.entry('app').clear().add('./src/main-prod.js')
    })
    config.when(process.env.NODE_ENV === 'development',config=>{
      config.entry('app').clear().add('./src/main-dev.js')
    })
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 通过externals 加载外部 CDN 资源,对于externals中的第三方依赖包,在用到依赖包的时候,会找window全局对象上查找并直接使用现成的对象,能够让打包的项目体积更小;只有production模式才有必要配置externals节点

第一步:vue.config.js——>配置externals节点
在这里插入图片描述

//配置后的vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave:false,
  // 通过 chainWebpack 为开发模式与发布模式指定不同的打包入口
  chainWebpack: config => {
    // 发布模式
    config.when(process.env.NODE_ENV === 'production',config=>{
      config.entry('app').clear().add('./src/main-prod.js')

   <span class="token comment">// 通过externals 加载外部 CDN 资源</span>
  config<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'externals'</span><span class="token punctuation">,</span><span class="token punctuation">{</span>
    <span class="token literal-property property">vpe</span> <span class="token operator">:</span> <span class="token string">' Vue '</span><span class="token punctuation">,</span>
    <span class="token string-property property">'vue-router'</span><span class="token operator">:</span> <span class="token string">'VueRouter'</span><span class="token punctuation">,</span>
    <span class="token literal-property property">axios</span><span class="token operator">:</span> <span class="token string">'axios'</span><span class="token punctuation">,</span>
    <span class="token literal-property property">lodash</span><span class="token operator">:</span> <span class="token string">'_'</span><span class="token punctuation">,</span> 
    <span class="token literal-property property">echarts</span><span class="token operator">:</span> <span class="token string">'echarts'</span><span class="token punctuation">,</span>
    <span class="token literal-property property">nprogress</span><span class="token operator">:</span><span class="token string">'NProgress'</span><span class="token punctuation">,</span>
    <span class="token string-property property">'vue-quill-editor'</span><span class="token operator">:</span> <span class="token string">'VueQuillEditor'</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>

config<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span>process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">NODE_ENV</span> <span class="token operator">===</span> <span class="token string">'development'</span><span class="token punctuation">,</span><span class="token parameter">config</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span>
  config<span class="token punctuation">.</span><span class="token function">entry</span><span class="token punctuation">(</span><span class="token string">'app'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'./src/main-dev.js'</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>

}
})

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

第二步:导入的样式表也会被导入到输出文件中,导致体积大;临时注释掉main.prod.js中的import的VueQuillEditor样式表;进行如下配置;【注意版本号】
在这里插入图片描述
进一步添加js文件的CDN引用:
在这里插入图片描述

<!-- 富文本编辑器样式表文件 -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.7/quill.core.min.css"/>
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.7/quill.snow.min.css" />
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.7/quill.bubble.min.css"/>

<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/vue/2.6.14/vue.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> <span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/vue-router/3.5.1/vue-router.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span> <span class="token operator">--</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/axios/1.3.4/axios.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/echarts/5.4.1/echarts.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
  <span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> 富文本编辑器的 js 文件 <span class="token operator">--</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/quill/1.3.7/quill.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.jsdelivr.net/npm/vue-quill-editor@3.0.6/dist/vue-quill-editor.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span> 

 

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. .通过 CDN 优化 ElementUl 的打包

第一步:在这里插入图片描述

<!-- element-ui的样表文件-->
    <link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.13/theme-chalk/index.css" />
    <!-- element-ui的 js 又件-->
    <script src="https://cdn.staticfile.org/element-ui/2.15.13/index.js"></script>
  • 1
  • 2
  • 3
  • 4

第二步:临时注释掉
// 引入自定义插件 (封装element按需引入模块)
// import element from ‘./plugins/element’

  1. 首页内容定制(根据production模式和development模式定制)
    不同的打包环境下,首页内容可能会有所不同,我们可以通过插件的方式进行定制;
    isProd的值为True表示production模式,为FALSE表示development模式;

第一步:对vue.config.js中chainWebpack的属性进行调整:

// 通过 chainWebpack 为开发模式与发布模式指定不同的打包入口
  chainWebpack: config => {
    // 1、发布模式
    config.when(process.env.NODE_ENV === 'production',config=>{
      config.entry('app').clear().add('./src/main-prod.js')

   <span class="token comment">// 通过externals 加载外部 CDN 资源</span>
  config<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'externals'</span><span class="token punctuation">,</span><span class="token punctuation">{</span>
    <span class="token literal-property property">vue</span> <span class="token operator">:</span> <span class="token string">' Vue '</span><span class="token punctuation">,</span>
    <span class="token string-property property">'vue-router'</span><span class="token operator">:</span> <span class="token string">'VueRouter'</span><span class="token punctuation">,</span>
    <span class="token literal-property property">axios</span><span class="token operator">:</span> <span class="token string">'axios'</span><span class="token punctuation">,</span>
    <span class="token literal-property property">lodash</span><span class="token operator">:</span> <span class="token string">'_'</span><span class="token punctuation">,</span> 
    <span class="token literal-property property">echarts</span><span class="token operator">:</span> <span class="token string">'echarts'</span><span class="token punctuation">,</span>
    <span class="token string-property property">'vue-quill-editor'</span><span class="token operator">:</span> <span class="token string">'VueQuillEditor'</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span>

  <span class="token comment">// 不同的打包环境下,首页内容可能会有所不同</span>
  <span class="token comment">// 我们可以通过插件的方式进行定制,根据isProd的值,来决定如何染页面结构,发布模式插件配置如下:</span>
  config<span class="token punctuation">.</span><span class="token function">plugin</span><span class="token punctuation">(</span><span class="token string">'html'</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">tap</span><span class="token punctuation">(</span><span class="token parameter">args</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
    args<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>isProd <span class="token operator">=</span> <span class="token boolean">true</span>
    <span class="token keyword">return</span> args
  <span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>

<span class="token comment">// 2、开发模式</span>
config<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span>process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">NODE_ENV</span> <span class="token operator">===</span> <span class="token string">'development'</span><span class="token punctuation">,</span><span class="token parameter">config</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span>
  config<span class="token punctuation">.</span><span class="token function">entry</span><span class="token punctuation">(</span><span class="token string">'app'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'./src/main-dev.js'</span><span class="token punctuation">)</span>

  <span class="token comment">// 不同的打包环境下,首页内容可能会有所不同</span>
  <span class="token comment">// 我们可以通过插件的方式进行定制,根据isProd的值,来决定如何染页面结构,开发模式插件配置如下:</span>
  config<span class="token punctuation">.</span><span class="token function">plugin</span><span class="token punctuation">(</span><span class="token string">'html'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">tap</span><span class="token punctuation">(</span><span class="token parameter">args</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
    args<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>isProd <span class="token operator">=</span> <span class="token boolean">false</span>
    <span class="token keyword">return</span> args
  <span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>

}

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

第二步:在public/index.html首页中,可以根据isProd的值,来决定如何染页面结构

<title><%=htmlWebpackPlugin.options.isProd?'':'dev-' %>电商后台管理系统</title>

<!-- 在production模式下isProd = true,会获取CDN里的依赖资源,development模式下isProd = false,用本地下载的依赖 -->
<% if(htmlWebpackPlugin.options.isProd){ %>
前面CDN引入的依赖资源(富文本编辑器+elemen-ui)
<% } %>


前面CDN引入的依赖资源(富文本编辑器+elemen-ui),代码如下:
<!-- 富文本编辑器样式表文件 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.7/quill.core.min.css"/>
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.7/quill.snow.min.css" />
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.7/quill.bubble.min.css"/>


<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/vue/2.6.14/vue.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/vue-router/3.5.1/vue-router.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/axios/1.3.4/axios.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/echarts/5.4.1/echarts.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
  <span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> 富文本编辑器的 js 文件 <span class="token operator">--</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/quill/1.3.7/quill.min.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.jsdelivr.net/npm/vue-quill-editor@3.0.6/dist/vue-quill-editor.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span> 

<span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> element<span class="token operator">-</span>ui的样表文件<span class="token operator">--</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>link rel<span class="token operator">=</span><span class="token string">"stylesheet"</span> href<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/element-ui/2.15.13/theme-chalk/index.css"</span> <span class="token operator">/</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> element<span class="token operator">-</span>ui的 js 又件<span class="token operator">--</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>script src<span class="token operator">=</span><span class="token string">"https://cdn.staticfile.org/element-ui/2.15.13/index.js"</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span>

 

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

第三步:由于对首页内容根据production模式和development模式进行了定制,需要将前面注释掉的富文本编辑器样式,以及element-ui样式引入取消注释,最终项目会根据不同模式展示首页

7. 路由懒加载
当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后**[当路由被访问的时候才加载对应组件**],这样就会更加高效。

在这里插入图片描述

简化:
不需要在route.js文件 import UserDetails from ‘./views/UserDetails.vue’;直接路由懒加载
{
name:‘search’, //商品搜索
path:‘/search’,
component:()=>import(‘@/pages/Search’), [路由被访问才加载组件]

 

 

分享此文一切功德,皆悉回向给文章原作者及众读者.

免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

 

 

蓝蓝设计(www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的大数据可视化界面设计B端界面设计桌面端界面设计APP界面设计图标定制用户体验设计交互设计UI咨询高端网站设计平面设计,以及相关的软件开发服务,咨询电话:01063334945。

关键词:UI咨询UI设计服务公司软件界面设计公司、界面设计公司、UI设计公司UI交互设计公司数据可视化设计公司用户体验公司高端网站设计公司

银行金融软件UI界面设计能源及监控软件UI界面设计气象行业UI界面设计轨道交通界面设计地理信息系统GIS UI界面设计航天军工软件UI界面设计医疗行业软件UI界面设计教育行业软件UI界面设计企业信息化UI界面设计、软件qt开发软件wpf开发软件vue开发

 

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档