这篇文章主要围绕鸿蒙OS如何开发一个前端应用详解和鸿蒙os如何开发一个前端应用详解图展开,旨在为您提供一份详细的参考资料。我们将全面介绍鸿蒙OS如何开发一个前端应用详解的优缺点,解答鸿蒙os如何开发一
这篇文章主要围绕鸿蒙OS如何开发一个前端应用详解和鸿蒙os如何开发一个前端应用详解图展开,旨在为您提供一份详细的参考资料。我们将全面介绍鸿蒙OS如何开发一个前端应用详解的优缺点,解答鸿蒙os如何开发一个前端应用详解图的相关问题,同时也会为您带来ChatGPT分享-如何开发一个LLM应用、iOS如何开发简单的手绘应用实例详解、nodejs如何开发一个新闻网站、WinForm应用实战开发 - 如何开发一个日程视图?(Part 1)的实用方法。
本文目录一览:- 鸿蒙OS如何开发一个前端应用详解(鸿蒙os如何开发一个前端应用详解图)
- ChatGPT分享-如何开发一个LLM应用
- iOS如何开发简单的手绘应用实例详解
- nodejs如何开发一个新闻网站
- WinForm应用实战开发 - 如何开发一个日程视图?(Part 1)
鸿蒙OS如何开发一个前端应用详解(鸿蒙os如何开发一个前端应用详解图)
鸿蒙的诞生
HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统;它实现了一个非常轻量级的 MVVM 模式。通过使用和 vue2 相似的属性劫持技术实现了响应式系统。鸿蒙 JS 框架支持 ECMAScript 5.1;js runtime 没有使用 V8,也没有使用 jscore。而是选择了 JerryScript。JerryScript 是用于物联网的超轻量 JavaScript 引擎。Jerryscript是由三星开发的一款JavaScript引擎,是为了让JavaScript开发者能够构建物联网应用。物联网设备在CPU性能和内存空间上都有着严重的制约。因此,三星设计了JerryScript引擎,它能够运行在小于64KB内存上,且全部代码能够存储在不足200KB的只读存储(ROM)上。说到这里,我想身为前端的我们是不是该搞点事情,比如给自己的华为手表上写一个APP应用,让他定时叫你敷面膜;或者写一个新闻APP,类似今日头条,数据么,可以造假;
编写一个HarmonyOS
第一步
首先去官网下载DevEco Studio开发工具,下载地址:developer.harmonyos.com/cn/develop/…
第二步
新建鸿蒙项目,HarmonyOS提供了两种FA(Feature Ability)的UI开发框架:Java UI框架和JS UI框架。
我们使用JS UI框架即可;选择好之后进入编码。
创建新项目选择模板,官方提供了好多模板,我们选一个简单地js模板
第三步
开始编码啦,目录结构如下图,我们只需要新建文件夹,然后在创建页面
新建页面的时候,相对应的config.json配置文件会自动更新,无需手动添加
"js": [ { "pages": [ "pages/index/index", "pages/index/details/details" ], "name": "default", "window": { "designWidth": 720, "autoDesignWidth": true } } ]
来看看我们的index页面的HTML代码
<div> <text> Hello Word </text> <buttontype="capsule" value="Next" on:click="launch"></button> </div>
js代码
import router from ''@system.router''; export default { data: { title: "" }, onInit() { this.title = this.$t(''strings.world''); }, launch() { router.push ({ uri:''pages/index/details/details'', // 指定要跳转的页面 params: { title: ''Hi Here'', } }) } }
css代码
.container { flex-direction: column; justify-content: center; align-items: center; } .text{ font-size: 42px; } .button { width: 300px; height: 60px; background-color: #007dff; font-size: 40px; text-color: white; } @media screen and (device-type: tablet) and (orientation: landscape) { .title { font-size: 100px; } } @media screen and (device-type: wearable) { .title { font-size: 28px; color: #FFFFFF; } } @media screen and (device-type: tv) { .container { background-image: url("../../common/images/Wallpaper.png"); background-size: cover; background-repeat: no-repeat; background-position: center; } .title { font-size: 100px; color: #FFFFFF; } } @media screen and (device-type: phone) and (orientation: landscape) { .title { font-size: 60px; } }
是熟悉的味道,嘿嘿!目前为止,我们已经完成了一个简单地应用了,看看效果吧!
右边是开发工具自带的实时展示效果,仔细的朋友应该发现,我们写了一套代码,适应了多端,
来看看手表上的展示效果
达到这样的效果是因为我们在config.json配置文件中配置了
"deviceType": [ "phone", "tv", "wearable", "tablet" ],
如果你没有华为设备,不怕,我们有真实的模拟器,按照如下操作,就可以看到真实效果;
第四步
代码撸完了,接下来该打包上线了
发布应用比较麻烦,由于本人例子简单,肯定审核不过的,所以也没有在进一步深入,详情猛戳:
developer.harmonyos.com/cn/docs/doc…
至此已经全部结束!
总结
到此这篇关于鸿蒙OS如何开发一个前端应用的文章就介绍到这了,更多相关鸿蒙OS开发前端应用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- HarmonyOS鸿蒙基本控件的实现
- 华为鸿蒙OS之HelloWorld的实现
- 鸿蒙OS运行第一个“hello world”
ChatGPT分享-如何开发一个LLM应用
1背景
ChatGPT引起巨大的业界震撼,各行各业都在讨论大语言模型、通用人工智能。AI经历了五十多年的发展,现在正处于产业结构水平化发展的关键时期。这一变化源于NLP领域范式的转变,从“预训练+微调”向“预训练、提示、预测”模式演进。在这一新模式下,下游任务适应预训练模型,使得一个大型模型能适用于多个任务。这一变化为AI产业的水平化分工奠定了基础,大型语言模型成为基础设施,Prompt Engineering公司层出不穷,专注于连接用户和模型。AI产业的分工初步形成,包括底层基础设施(云服务商)、大型模型、Prompt Engineering平台和终端应用。随着AI产业变革,开发者可以充分利用大型语言模型(LLM)和Prompt Engineering来开发创新应用。
2Prompt-Ops下的应用
目前要开发一个基于LLM的应用,我们面临最大的工程上的问题是什么?
- 大语言模型不能联网,无法获取最新的信息
- 大语言模型没有我们私有的数据,无法回答垂直方向的问题
- 大语言模型的开放API(text-davinci-003)没有像ChatGPT那样优秀的上下文能力
- 大语言模型无法驱动其他工具。
2.1 Langchain等工程框架解决了这些工程上的问题
以Langchain为例简单来说:LangChain是 LLM 底层能力的封装,是一种 Prompt Engineering或者说是Prompt-Ops。
- 它可以接入各种不同LLM的服务,抽象了各种大语言模型的调用
- 它可以创建各种PromptTemplate,实现定制化的Prompt模版
- 它可以创建链来组合调用PromptTemplate
- 它可以通调用各种工具,实现GPT-3目前不擅长的事情,比如搜索/数学/链接私有数据库/Python代码
- 它可以使用代理, 驱动LLM 来确定采取哪些行动以及采取何种顺序。动作可以是使用工具并观察其输出,也可以是返回给用户。
- 它可以通过它的Memory模块,来实现对话历史的建模。
2.2 一些Langchain的开发例子
2.2.1 结合搜索的GPT
这是一个用ChatGPT和LangChain开发的Demo对比的例子,输入的都是“谁是周杰伦的老婆?她当前的年龄乘以0.23是多少?”。可以看出ChatGPT或者GPT-3.5因为没有搜索能力,回答的结果是错误的。右边用LangChain结合OpenAI的GPT-3.5的API则输出了正确的结果,他会逐步去搜索获得正确信息,得出正确结果,而且中间的过程是框架自动处理的,我除了输入问题没有其他操作。
2.2.2 将自然语言转为Python代码并自行纠错
这是一个非常令人震惊的例子,在这个流程中,它自己发现函数未定义的报错并自行纠正。
2.2.3 使用GPT-3 + Statmuse + Langchain查询NBA数据
Fuzzy API composition: querying NBA stats with GPT-3 + Statmuse + Langchain
使用Langchain与体育数据搜索网站相结合,提问复杂的数据问题并得到准确的回复。例如:“波士顿凯尔特人队在这个 2022-2023 赛季的 NBA 赛季场均防守得分是多少?与他们上赛季的平均水平相比,百分比变化如何?”
2.2.4 连接Python REPL打开浏览器播放音乐
一个蛮科幻的场景,我用Langchain接入了Python REPL工具,输入“给我放一首歌”,它导入了webBrowser包,调用代码打开了浏览器,给我播放了一首 《never gonna give you up》
def pythonTool(): bash = BashProcess() python_repl_util = Tool( "Python REPL", PythonREPL().run, """A Python shell. Use this to execute python commands. Input should be a valid python command. If you expect output it should be printed out.""", ) command_tool = Tool( name="bash", descriptinotallow="""A Bash shell. Use this to execute Bash commands. Input should be a valid Bash command. If you expect output it should be printed out.""", func=bash.run, ) # math_tool = _get_llm_math(llm) # search_tool = _get_serpapi() tools = [python_repl_util, command_tool] agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True) agent.run("给我播放一首音乐")
2.2.5 连接私有数据
连接私有数据对第三方企业做LLM应用来说非常重要。下面举几个例子
- LangchainJs的文档,结合了Langchain:AI-powered search for LangchainJS Documentation,你可以直接问文档内容、技术细节。
- 数据库产品 Supabase也做了同样的事情,将自己的文档与ChatGPT相连接,使得开发者可以很方便的询问/查找自己遇到的技术问题。https://supabase.com/docs
- 政府信息问答的一个例子:Co-pilot for government
法律公文和政策条款一般都非常复杂繁琐,这个demo中将旧金山政府的信息用Langchain与GPT结合,做到询问其中细节能获得准确回复的效果。
> Entering new AgentExecutor chain... I need to find out the size limit for a storage shed without a permit and then search for sheds that are smaller than that size. Action: SF Building Codes QA System Action Input: "What is the size limit for a storage shed without a permit in San Francisco?" Observation: The size limit for a storage shed without a permit in San Francisco is 100 square feet (9.29 m2). Thought:Now that I know the size limit, I can search for sheds that are smaller than 100 square feet. Action: Google Action Input: "Storage sheds smaller than 100 square feet" Observation: Results 1 - 24 of 279 ... Thought:I need to filter the Google search results to only show sheds that are smaller than 100 square feet and suitable for backyard storage. Action: Google Action Input: "Backyard storage sheds smaller than 100 square feet" Thought:I have found several options for backyard storage sheds that are smaller than 100 square feet and do not require a permit. Final Answer: The size limit for a storage shed without a permit in San Francisco is 100 square feet. There are many options for backyard storage sheds that are smaller than 100 square feet and do not require a permit, including small sheds under 36 square feet and medium sheds between 37 and 100 square feet.
2.3 结合私有数据问答
LLM应用与私有数据交互非常重要,我看到无数人在问一些ChatGPT无法回答的问题了:问认不认识谁、问自己公司业务细节、问各种可能不包含在预训练数据集里的东西。这些都已用Langchain和LlaMaIndex来解决。试想一下,将私有数据与LLM相结合,将改变数据原有的访问方式,通过问答能很自然地获取到自己需要的信息,这是比当前的搜索/打标分类都要高效的数据交互方式。
2.3.1 如何构建一个基于私有数据的LLM问答系统
向量数据库现在看起来是构建LLM App中很关键的一个组件。首先 LLM 的预训练和微调过程不可能包含我们所期待的私有数据,因此如何将LLM关联到私有数据成为一个很关键的需求。而且LLM的“接口”-自然语言通常不是像Key-Value的映射那样精确地。而且在这一阶段我们希望LLM去理解我们的知识库,而不是简单的在其中搜索相同的字符串,我们希望询问关于我们知识库的细节,并给出一定理解后的答案(以及来源),这样匹配向量这样的搜索方式是一个非常合适且关键的解决方案。还有一个关键点是,LLM在每次调用是按token计费(即文本量),并且目前的接口的上下文有着4096 tokens的限制。,因此面对庞大的数据,我们也不可能将所有的数据一次性传给LLM。因此才有了第一张图那个流程图的结构。本地预先将我们私有的数据转成向量存在Qdrant里,用户问答时,将用户的问题转为向量,然后去Qdrant里进行搜索(相似性匹配)得到Top K个结果,然后将这些结果(注意这里的结果已经是自然语言了)传给LLM进行总结输出。
2.3.2 结合私有数据问答的抽象流程
这里使用Langchain社区博客的流程图为例
私有数据分割成小于LLM上下文的分块,创建向量后存入向量数据库
将问题计算向量后在向量数据库进行相似性搜索,算出相关性较高的top k个结果后拼接prompt送往LLM获得答案。
2.3.3 重要组件
- OpenAI Ada模型:text-embedding-ada-002模型可以快速编码一个1536维的向量,我们可以使用这个向量来计算文本之间的相似性。
- Langchain / LLamaIndex:Langchain包含多种文本拆分器与文档连接器,方便将文件进行拆分并且在向量数据库中索引;LlamaIndex 可以从向量存储加载数据,类似于任何其他数据连接器。然后可以在 LlamaIndex 数据结构中使用此数据。
- 向量数据库,选型比较多:Chroma / FAISS / Milvus / PGVector / Qdrant / Pinecone等等。
2.3.4 OpenAI私有部署与成本的问题
再来聊聊最近那个OpenAI私有部署的新闻,如果用Langchain来做链接,面对庞大的私有数据,用一个embedding模型(OpenAI的ada)计算输入问题向量,用Qdrant等向量数据库来管理私有数据的向量和向量搜索,用Langchain来做中间的链接虽然可以解决问题,但是token的消耗却是不容忽视的成本问题。私有部署+微调可能能解决大部分前面提到的问题。可能是有钱大公司用Model instance和fine-tuning,小公司独立开发者用Langchain等框架。更未来OpenAI的LLM服务能力外溢,可能不需要Prompt了,甚至把Langchain的功能都能包括了,LLM应用的开发接入也许只需要一个接口调用。
2.4 2023年的LLM应用技术栈
2023 用来简单搭建 AI Demo 的最新技术栈:
- 托管: Vercel
- 前端: Next.js
- 后端: Vercel with flask
- 数据库: Supabase
- AI 模型: OpenAI / Replicate / Hugging Face
- LLM框架层: LangChain / LLaMaIndex
- 向量存储/搜索: Pinecone / FAISS
2.5 Prompt-Ops 目前最大的问题
一些关于 Langchain 这类Prompt-Ops这类工具的反对观点:stream.thesephist.com主要问题是在这类工具/框架,将自然语言作为代码和LLM的连接,使用非确定性语言本身作为控制流,有点疯狂。而且本身评估模型输出效果现在是个很麻烦的事,没有很好的解决方案,很多都是维护一个巨大的电子表格,靠人去评估。(也有用LLM评估LLM的方案,还比较早期)所以要投入生产,真实面对用户而不是作为twitter演示可能还有很多工作要做。
详细说说测试环节面临的巨大挑战。假如你的产品有一套研发阶段效果很好的prompt,交给测试后,可能测试上百条上千条就能看出问题了。由于效果无法保证,真正推出给c端用户会面临很大的挑战。而且没有用微调服务或者model instance的话,如果OpenAI更新了模型,你的生产环境的prompt可能需要全部重新测试一下效果。你的prompt也需要和代码一样按版本来管理,不管有没有prompt变更,每个版本上线前都需要进行回归测试。没有好的自动化评估方案的话,大量的case都需要测试人工来看会耗费非常多的人力。
结合私有数据的LLM应用目前开发起来在工程上已经有很多不错的方案了,很容易跑出效果不错的demo,但还是需要非常谨慎对待这样一种应用。毕竟我们不只是要做一个在社交媒体或者Leader面前演示的项目。提供给用户输入的是一个对话框,自然语言宽泛到即使你测试上万条结果也可能出现意想不到的结果,毕竟像new bing和chatGPT这样的产品也会被Prompt Injection。面对这种不确定性,工程上如何去避免,测试如何去覆盖都是一个成熟产品待解决或者说还有很多工作可以做的问题。
但我觉得也不必完全否定这类Prompt-Ops工具/框架,毕竟现阶段确实能做出很多不错的demo来验证想法。
3未来可能的一些产品形态
聊聊ChatGPT API开放后LLM应用可能的形态。
- 对话聊天,是最直观的应用方式,在API上做好对话历史的管理。
- 虚拟角色聊天,在基础对话聊天上,对API的prefix_message上做一些角色定义的prompt,可以实现类似Character.ai的效果。更深入可能是作为游戏角色、虚拟人、XR助手等。
- 类似Notion的文本辅助撰写工具,目前Notion、FlowUs都做了类似的应用。未来各家社区的发布器集成也是一个趋势,减低用户发布门槛,提升发布质量。
- 数据总结性工具,实现Chat-Your-Data,提供文档的输入给用户,让用户可以与自己提供的数据聊天,本质只涉及到互联网公开的数据与用户私有的数据。
- 大企业的Chat-Your-Data,各家大公司在原有业务基础上,结合大企业的私有数据,提供更优质的服务。比如结合用户点评的大众点评,能够用“想去放neo-soul和R&B音乐的酒吧”,比如我们的商详页,能够总结所有用户对这个商品的评价,并且可以让用户对这个商品的资料进行问答。
- 与政务、医疗、教育等领域结合,融合线上机构官网、线下大屏,提供更好的市民服务。
- 与其他工具比如IFTTT或者各种私有协议相结合,实现LLM可以访问更多的工具和系统,举个例子:iot场景,Office Copilot。
LLM应用实际是一种新的人机交互方式,能够让用户用自然语言与我们目前的系统沟通,很多应用甚至可以简化到只有一个聊天窗口。
4总结
目前来说由于通用大模型训练/部署的高成本来说,产业水平化分工的条件基本成熟,世界上并不需要很多个大模型,做LLM的应用将会是中小型企业和个人开发者的必然选择。新形态的编程/工程范式需要工程师去及时学习理解。目前的开源技术栈已经能满足大部分产品的需求,可以尝试快速实践demo来验证想法。
参考资料:
- https://blog.langchain.dev/tutorial-chatgpt-over-your-data/
Tutorial: ChatGPT Over Your Data
- https://qdrant.tech/articles/langchain-integration/
Question Answering with LangChain and Qdrant without boilerplate
- https://mp.weixin.qq.com/s/VZ6n4qlDx4bh41YvD1HqgQ
Atom Capital:深入探讨ChatGPT带来的产业变革
以上就是ChatGPT分享-如何开发一个LLM应用的详细内容,更多请关注php中文网其它相关文章!
iOS如何开发简单的手绘应用实例详解
开发一款简单的 iOS 手绘应用,
收集点,绘制形状,给形状着色,呈现给用户,好像就完了
框架是 Quartz2D
1, 收集点
首先需要有一个界面 UIView, 用这个界面监听用户的手势,收集点
- 用户按下手指
location(in, 从触摸事件中,获得在画板中的坐标
var lastPoint = CGPoint.zero override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } // ... lastPoint = touch.location(in: view) }
- 用户移动手指
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { // ... }
- 用户抬起手指
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { // ... }
2, 绘制形状,给形状着色
开辟一块绘图上下文 UIGraphicsGetCurrentContext,
使用采集的点连线
用户手绘的不是一段连续的曲线,是很多个线段拼接起来的
func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) { UIGraphicsBeginImageContext(view.frame.size) guard let context = UIGraphicsGetCurrentContext() else { return } // ... // 绘制 context.move(to: fromPoint) context.addLine(to: toPoint) context.setLineCap(.round) context.setBlendMode(.normal) context.setLineWidth(brushWidth) context.setStrokeColor(color.cgColor) context.strokePath() // ... UIGraphicsEndImageContext() }
3, 呈现给用户
第一步使用的 UIView 是 UIImageView,
- 绘制就是画一小段,取出画好的图片,赋给 UIImageView,我们就看到了
- 连续的绘制,是画一小段,取出画好的图片,赋给 UIImageView,并用变量保存下最新的图片
接着画,先把刚才的图片变量绘制一遍,再画一小段,取出画好的图片,赋给 UIImageView,并用变量保存下最新的图片
func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) { UIGraphicsBeginImageContext(view.frame.size) guard let context = UIGraphicsGetCurrentContext() else { return } tempImageView.image?.draw(in: view.bounds) // 绘制 ... tempImageView.image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() }
4, 画笔设置
修改画笔颜色和粗细
func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) { UIGraphicsBeginImageContext(view.frame.size) guard let context = UIGraphicsGetCurrentContext() else { return } // ... context.setBlendMode(.normal) // 调颜色 context.setLineWidth(brushWidth) // 调粗细 context.setStrokeColor(color.cgColor) // ... }
画笔变橡皮擦
- 方法一,把画笔的颜色,调成画板的颜色,就成了橡皮擦
- 方法 2 ,
把画笔的颜色,调成透明,
把绘图上下文的混色模式改掉
就成了橡皮擦
switch type { case .pencil, .none: context.setBlendMode(.color) case .eraser: context.setLineWidth(15) context.setStrokeColor(UIColor.clear.cgColor) context.setBlendMode(.clear) }
5,后续
更多功能:
加入文本输入功能,
需要一个文本框控件 UITextField、 UITextView
文本框控件一般可以拖动,
文本框放在画布上,拖出画布了,有些问题。
这时候要做一个边界检测
性能优化:
一般性能优化,就是打印函数的执行时间
当画布的大小为 1366 X 7700 ( iPad Pro + UIScrollView ) 的时候,画布很大,
全部绘制一遍,并取出图片,性能消耗很大
tempImageView.image?.draw(in: view.bounds) // ... tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
绘制一次,需要约 0.07 秒,
let t = Date() self.drawingImage() if #available(iOS 13.0, *) { let span = t.distance(to: Date()) print(span) }
我们期望 60 的 FPS, 每一帧计算时间 0.016, 所以频繁调用该方法,卡得厉害
之前的方法是一个点,一个点的绘制
移动一下,绘制一次
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } swiped = true let currentPoint = touch.location(in: view) drawLine(from: lastPoint, to: currentPoint) lastPoint = currentPoint }
画一段线, func touchesMoved() ,一般可以触发 30 ~ 60 次,收集的点比较多,线条柔和
此时频繁调用该消耗性能方法,
只能触发 6 次,画一段只能采集 6 个点,正常手速,就画出来一个多边形
可以这样优化,点的收集与绘制分离
使用一个 Timer ,每隔 0.15 秒,绘制一次
原本收集点,是一个 CGPoint, 现在收集点,是一个 [CGPoint]
- 原本画一次之前的 image, 连一根线,更新图片变量并呈现
n 个点, 来 n 次全画板绘制
- 现在画一次之前的 image, 连接多根线,更新图片变量并呈现
n 个点, 来 1 次全画板绘制
消耗性能的方法,少调用,就对了
tempImageView.image?.draw(in: view.bounds) // ... tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
前 4 点的代码,见 github
后续需要整理,tbd
总结
到此这篇关于iOS如何开发简单的手绘应用的文章就介绍到这了,更多相关iOS开发手绘应用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- IOS开发之多线程NSThiread GCD NSOperation Runloop
- iOS实现音乐播放器图片旋转
- iOS实现电子签名
- iOS WKWebview 白屏检测实现的示例
- iOS实现折叠单元格
- iOS蓝牙设备名称缓存问题的解决方法
- iOS 如何高效的使用多线程
- iOS程序性能优化的技巧
- iOS中各种UI控件属性设置示例代码
- 分析IOS RunLoop的事件循环机制
nodejs如何开发一个新闻网站
随着科技的不断发展,人们获取信息的方式也在不断改变。在这个信息时代,新闻网站已经成为人们获取新闻资讯的主要渠道之一。那么,node.js 如何开发一个新闻网站呢?下面我们就来简单探讨一下。
一、技术选型
在开发一个新闻网站时,我们通常需要用到的技术包括:
- 后端框架:Express.js
- 数据库:MongoDB
- 前端框架:Vue.js 或 React.js
二、项目架构
基于上述技术选型,我们可以构建出如下项目架构:
- 后端目录结构
在后端部分,我们可以将项目分为以下几个文件夹:
- bin:存放项目启动脚本
- config:存放配置文件
- controllers:存放路由处理相关代码
- models:存放数据库模型及相关代码
- public:存放静态文件
- routes:存放路由文件
- views:存放视图及相关代码
- app.js:项目入口文件
- 前端目录结构
在前端部分,我们可以将项目分为以下几个文件夹:
- assets:存放静态资源
- components:存放组件
- router:存放路由相关配置
- store:存放状态管理相关代码
- views:存放视图文件及相关代码
- App.vue:项目根组件
- main.js:项目入口文件
三、项目流程
在进行项目开发时,我们需要了解项目的基本流程。下面我们列举出每个流程所需要的具体步骤:
- 配置环境
在进行 Node.js 开发时,我们需要配置好 Node.js 和 npm 环境,并且安装好所需模块。此外,我们需要安装 MongoDB 数据库,并在项目中连接数据库。
- 编写后端代码
我们需要编写 Express.js 的路由、控制器和模型等相关代码,来实现后端的基本架构。其中,模型文件需要定义 MongoDB 中的数据模型。
- 编写前端代码
我们需要编写 Vue.js 或 React.js 的视图、组件和路由等相关代码,来实现前端的基本架构。
- 联调代码
在确认前后端代码基本无误后,我们需要进行前后端联调,以确保项目能够正常运行。
- 测试和部署
最后,我们需要进行项目测试和部署。测试包括单元测试、集成测试和性能测试等。部署则需要将项目上传到服务器,并且配置好服务器环境。
四、总结
以上就是使用 Node.js 开发一个新闻网站的基本流程。当然,实际开发过程中还有很多需要注意的细节,我们需要根据实际情况进行调整。同时,开发过程中也需要结合用户需求和体验,不断完善项目,以提供更好的服务。
以上就是nodejs如何开发一个新闻网站的详细内容,更多请关注php中文网其它相关文章!
WinForm应用实战开发 - 如何开发一个日程视图?(Part 1)
在一些应用场景中,我们可能需要记录某一天,某个时段的日程安排,那么这个时候就需要引入了DevExpress的日程控件XtraScheduler了,这个控件功能非常强大,提供了很好的界面展现方式,以及很多的事件、属性给我们定制修改,能很好满足我们的日程计划安排的需求,本文全面分析并使用这个控件,希望把其中的经验与大家分享。
DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!
日程控件的表现效果
整个日程控件,可以分为日视图、周视图、月视图等等,当然还有一些不常用的时间线、甘特图等,本例我们来关注控件的使用以及这几个视图的处理。先来看看他们的界面效果,如下所示。
日视图:

在视图里面,默认可以打开响应的日程事件进行编辑的。

周视图:

月视图:

日程控件XtraScheduler的使用
我们在上面展示了这个控件的几个视图的界面,一般情况下的控件使用还是很方便的,也就是直接拖拉SchedulerControl到WinForm界面即可,但是我们为了符合我们的使用需求,还是需要设置不少属性或者事件的处理的。
1. 几种视图的切换
由于控件,默认也是提供右键菜单,对几种控件视图进行切换的,如下菜单所示。

但是我们也可以通过代码进行切换处理,具体代码很简单,该控件已经进行了很好的封装,直接使用即可。
private void btnDayView_Click(object sender, EventArgs e) { //需要为日视图类型 this.schedulerControl1.ActiveViewType = SchedulerViewType.Day; } private void btnWeekView_Click(object sender, EventArgs e) { //需要为周视图类型 this.schedulerControl1.ActiveViewType = SchedulerViewType.FullWeek; } private void btnMonthView_Click(object sender, EventArgs e) { //需要为周视图类型 this.schedulerControl1.ActiveViewType = SchedulerViewType.Month; }
2. 设置禁用编辑、新增等功能处理
该日程控件,可以通过控件属性,对日程记录的新增、编辑、删除等菜单功能进行屏蔽或者开放(默认是开放的)。
通过控件属性的方式,操作如下所示。

当然我们也可以通过代码对这些属性进行设置,如下代码所示。
SchedulerControl control = this.schedulerControl1; //禁用日程增加、删除、修改、拖拉等操作 control.OptionsCustomization.AllowAppointmentCreate = DevExpress.XtraScheduler.UsedAppointmentType.None; control.OptionsCustomization.AllowAppointmentDelete = DevExpress.XtraScheduler.UsedAppointmentType.None; control.OptionsCustomization.AllowAppointmentEdit = DevExpress.XtraScheduler.UsedAppointmentType.None; control.OptionsCustomization.AllowAppointmentDrag = DevExpress.XtraScheduler.UsedAppointmentType.None; control.OptionsCustomization.AllowAppointmentMultiSelect = false; control.OptionsRangeControl.AllowChangeActiveView = false; control.Views.MonthView.CompressWeekend = false; control.OptionsBehavior.ShowRemindersForm = false;
3. 日程控件的头部日期显示处理
默认的日程控件,其日视图、周视图的头部默认显示的是日期,如下所示。

如果需要把它修改为我们想要的头部内容(如加上星期几),那么就需要对这个头部显示进行自定义的处理才可以了。

有两种方式可以实现这个功能, 其一是引入一个自定义类,如下所示。
public class CustomHeaderCaptionService : HeaderCaptionServiceWrapper { public CustomHeaderCaptionService(IHeaderCaptionService service) : base(service) { } public override string GetDayColumnHeaderCaption(DayHeader header) { DateTime date = header.Interval.Start.Date; return string.Format("{0:M}({1})", date, date.ToString("dddd",new System.Globalization.CultureInfo("zh-cn"))); } }
然后在控件初始化后,添加对这个处理实现即可。
//重载头部显示 IHeaderCaptionService headerCaptionService = (IHeaderCaptionService)control.GetService(typeof(IHeaderCaptionService)); if (headerCaptionService != null) { CustomHeaderCaptionService customHeaderCaptionService = new CustomHeaderCaptionService(headerCaptionService); control.RemoveService(typeof(IHeaderCaptionService)); control.AddService(typeof(IHeaderCaptionService), customHeaderCaptionService); }
或者也可以重载CustomDrawDayHeader事件进行修改处理,如下所示。(推荐采用上面一种)
private void schedulerControl1_CustomDrawDayHeader(object sender, CustomDrawObjectEventArgs e) { //重绘Header部分,设置日程头部显示格式 SchedulerControl control = this.schedulerControl1; SchedulerViewType svt = control.ActiveViewType; if (svt == SchedulerViewType.Day || svt == SchedulerViewType.FullWeek || svt == SchedulerViewType.Week || svt == SchedulerViewType.WorkWeek) { DayHeader header = e.ObjectInfo as DayHeader; DateTime date = header.Interval.Start; header.Caption = string.Format("{0}({1})", date.ToString("MM月d日"), date.ToString("dddd", new System.Globalization.CultureInfo("zh-cn"))); } }
4. 自定义菜单的处理
在日程控件XtraScheduler的使用中,我们也可以获取到控件的菜单对象,并对它进行修改、删除,或者新增自己的菜单事件也是可以的,我们实现事件PopupMenuShowing即可,这个事件在菜单显示前进行处理,如下面所示代码。
private void schedulerControl1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { //对日程的右键菜单进行修改 SchedulerControl control = this.schedulerControl1; if (e.Menu.Id == DevExpress.XtraScheduler.SchedulerMenuItemId.DefaultMenu) { //隐藏【视图更改为】菜单 SchedulerPopupMenu itemChangeViewTo = e.Menu.GetPopupMenuById(SchedulerMenuItemId.SwitchViewMenu); itemChangeViewTo.Visible = false; //删除【新建所有当天事件】菜单 e.Menu.RemoveMenuItem(SchedulerMenuItemId.NewAllDayEvent); //设置【新建定期日程安排】菜单为不可用 e.Menu.DisableMenuItem(SchedulerMenuItemId.NewRecurringAppointment); //改名【新建日程安排】菜单为自定义名称 SchedulerMenuItem item = e.Menu.GetMenuItemById(SchedulerMenuItemId.NewAppointment); if (item != null) item.Caption = "新建一个计划"; //创建一个新项,用内置的命令 ISchedulerCommandFactoryService service = (ISchedulerCommandFactoryService)control.GetService(typeof(ISchedulerCommandFactoryService)); SchedulerCommand cmd = service.CreateCommand(SchedulerCommandId.PrintPreview);//打印预览 SchedulerMenuItemCommandWinAdapter menuItemCommandAdapter = new SchedulerMenuItemCommandWinAdapter(cmd); DXMenuItem menuItem = (DXMenuItem)menuItemCommandAdapter.CreateMenuItem(DXMenuItemPriority.Normal); menuItem.BeginGroup = true; e.Menu.Items.Add(menuItem); //创建一个新的自定义事件菜单 DXMenuItem menuTest = new SchedulerMenuItem("测试菜单"); menuTest.Click += menuItem2_Click; menuTest.BeginGroup = true; e.Menu.Items.Add(menuTest); } } void menuItem2_Click(object sender, EventArgs e) { MessageDxUtil.ShowTips("测试菜单功能"); }
本文转载自:博客园 - 伍华聪
DevExpress技术交流群6:600715373 欢迎一起进群讨论
更多DevExpress线上公开课、中文教程资讯请上中文网获取
今天关于鸿蒙OS如何开发一个前端应用详解和鸿蒙os如何开发一个前端应用详解图的分享就到这里,希望大家有所收获,若想了解更多关于ChatGPT分享-如何开发一个LLM应用、iOS如何开发简单的手绘应用实例详解、nodejs如何开发一个新闻网站、WinForm应用实战开发 - 如何开发一个日程视图?(Part 1)等相关知识,可以在本站进行查询。
本文标签: