Top Related Projects
GitHub notifications alike app for Django
Quick Overview
The youth5201314/banner
repository is a collection of banner designs and templates that can be used for various purposes, such as website headers, social media posts, and promotional materials. The project provides a wide range of customizable banner designs that can be easily modified to fit different needs.
Pros
- Diverse Design Options: The repository offers a diverse collection of banner designs, catering to various styles and preferences.
- Customizable Templates: The banner templates are designed to be easily customizable, allowing users to modify the content, colors, and layout to suit their specific requirements.
- High-Quality Graphics: The banner designs feature high-quality graphics and visuals, ensuring a professional and visually appealing final product.
- Convenient Access: The repository is hosted on GitHub, making it easily accessible and shareable with others.
Cons
- Limited Interactivity: The banner designs are primarily static, with limited interactive or dynamic features.
- Potential Copyright Issues: Some of the banner designs may use copyrighted images or elements, which could lead to legal issues if used without proper attribution or licensing.
- Maintenance Concerns: As the repository is user-contributed, the quality and consistency of the banner designs may vary, and there may be a need for ongoing maintenance and curation.
- Lack of Customization Tools: The repository does not provide any built-in tools or interfaces for customizing the banner designs, which may require additional design software or skills.
Getting Started
To use the banner designs from the youth5201314/banner
repository, follow these steps:
- Clone the repository to your local machine:
git clone https://github.com/youth5201314/banner.git
- Navigate to the cloned repository:
cd banner
-
Explore the available banner designs in the various subdirectories, such as
abstract
,business
, andsocial-media
. -
Choose the banner design that best suits your needs and open the corresponding image file.
-
Use your preferred image editing software (e.g., Adobe Photoshop, GIMP, Canva) to customize the banner design by modifying the text, colors, and layout as needed.
-
Save the customized banner design and use it for your intended purpose, such as a website header, social media post, or promotional material.
Remember to respect any copyright or licensing restrictions associated with the banner designs, and consider providing attribution to the original creators if applicable.
Competitor Comparisons
GitHub notifications alike app for Django
Pros of django-notifications/django-notifications
- Provides a comprehensive set of features for managing notifications in a Django web application, including the ability to create, read, and delete notifications.
- Supports multiple notification types, such as email, push notifications, and in-app notifications.
- Includes a flexible and customizable notification system that can be easily integrated into existing Django projects.
Cons of django-notifications/django-notifications
- May have a steeper learning curve compared to a simpler solution like Banner, especially for developers who are new to Django.
- Requires additional configuration and setup to integrate with a Django project, which may add complexity to the development process.
- May have a larger footprint in terms of dependencies and codebase size compared to a more lightweight solution like Banner.
Code Comparison
Banner (youth5201314/banner)
from django.db import models
class Banner(models.Model):
title = models.CharField(max_length=100)
image = models.ImageField(upload_to='banners')
link = models.URLField(blank=True, null=True)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
django-notifications/django-notifications
from django.db import models
from django.contrib.auth.models import User
class Notification(models.Model):
recipient = models.ForeignKey(User, on_delete=models.CASCADE, related_name='notifications')
actor = models.ForeignKey(User, on_delete=models.CASCADE, related_name='notify_actor')
verb = models.CharField(max_length=255)
target = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True, related_name='target_object')
timestamp = models.DateTimeField(auto_now_add=True)
unread = models.BooleanField(default=True)
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Banner 2.0 å ¨æ°å级
åªåä¸ä¸ªå¯ä»¥èªå®ä¹çè½®æ容å¨ï¼ä¸ä¾µå ¥UI ââââ Banner 2.0
> åä½èéåé¦çé®é¢æé½æçï¼ä¸æ¯ä¸è§£å³ï¼ææ¶ççå¾é¾å¤ç°ï¼
> å¦æè½å¨æ交é®é¢æ¶ï¼ææ¡ä»¶æä¾ä¸ªdemoåå°æé®ç®±ï¼æ¹ä¾¿å®ä½é®é¢ï¼æ¯ç«å¤§å®¶çåºæ¯å使ç¨æ¹å¼é½æå·®å¼ï¼
> æèªå·±ä¹å¨ä½¿ç¨ï¼å¨å¤ä¸ªåä¸çº§APPä¸ä¸ç´ç¨³å®è¿è¡ï¼å¦æçæ严éé®é¢è¯å®ç¬¬ä¸æ¶é´å°±ä¿®å¤äº
Banner 1.4.10(è¿æ³çèçæ¬çå¯ä»¥ç¹å»è¿é)
éå«å·²ä¹ ï¼ä»æ°åå½
- é¦å
æ声æå ç¹ï¼
- è¿åªæ¯ä¸ä¸ªå¼æºåºï¼å¦æ满æä½ å¯ä»¥ä½¿ç¨ãå¯ä»¥åé´ä¿®æ¹ï¼å¸æå¯¹ä½ ä»¬ææ帮å©ã
- å¦æä¸æ»¡æ请å好çæåºï¼æ³¨æé误ç详ç»ä¿¡æ¯æè ä¿®æ¹å»ºè®®ï¼å¥½çæ³æ³åèªå®ä¹çä¸è¥¿äº¦å¯ä»¥ç´æ¥æ交ï¼å¤§å®¶é½è½æ¥ä¸èµ·å®åã
- å¦æä½ è§å¾å®å¨æ¯æ²¡ç¨ï¼ä¹è¯·ä½ åä¸ä¸ªæèªæä¿®å »ç人ã
主è¦æ¹è¿åè½ä»ç»
æå¼å§æ¯æ³ä¸ä¼ 以ååºäºviewpageræ´æ°å¥½ççæ¬ï¼ä½æ¯ççviewpager2æ£å¼çå·²ç»åºæ¥äºï¼å°±ä¸æ°çå§ï¼viewpager2ç¡®å®æ¯viewpageræ§è½å¥½å¾å¤ã
- 使ç¨äºViewPager2为åºç¡æ§ä»¶ ViewPager2ä»ç»
- æ¯æäºandroidxå ¼å®¹å
- æ¹ä¾¿äºUIãIndicatorèªå®ä¹
- æ¯æç»å»ææãé æææ
- å ¼å®¹äºæ°´å¹³ååç´è½®æï¼ä¹å¯ä»¥å®ç°ç±»ä¼¼æ·å®å¤´æ¡çææ
- ä¾èµå ç®ååªéè¦å¯¼å ¥äºViewPager2
ææå¾
æ´å¤ææè¿è¡demoæ¥ç
å ç½®äºå¤ç§PageTransformerææ
å ç½®çPageTransformer |
---|
AlphaPageTransformer |
DepthPageTransformer |
RotateDownPageTransformer |
RotateUpPageTransformer |
RotateYTransformer |
ScaleInTransformer |
ZoomOutPageTransformer |
ä¹å¯ä»¥ç»å使ç¨æææ´ä½³ |
æ¹æ³
æ´å¤æ¹æ³ä»¥å®é 使ç¨ä¸ºåï¼ä¸é¢ä¸ä¸å®å ¨é¨ååºäº
æ¹æ³å | è¿åç±»å | æè¿° |
---|---|---|
getAdapter() | extends BannerAdapter | è·åä½ è®¾ç½®çBannerAdapter |
getViewPager2() | ViewPager2 | è·åViewPager2 |
getIndicator() | Indicator | è·åä½ è®¾ç½®çæ示å¨ï¼æ²¡æ设置ç´æ¥è·åä¼æå¼å¸¸å¦ï¼ |
getIndicatorConfig() | IndicatorConfig | è·åä½ è®¾ç½®çæ示å¨é 置信æ¯ï¼æ²¡æ设置ç´æ¥è·åä¼æå¼å¸¸å¦ï¼ |
getRealCount() | int | è¿åbannerçå®æ»æ° |
setUserInputEnabled(boolean) | this | ç¦æ¢æå¨æ»å¨Banner;true å 许ï¼false ç¦æ¢ |
setDatas(List | this | éæ°è®¾ç½®banneræ°æ® |
isAutoLoop(boolean) | this | æ¯å¦å 许èªå¨è½®æ |
setLoopTime(long) | this | 设置轮æé´éæ¶é´ï¼é»è®¤3000毫ç§ï¼ |
setScrollTime(long) | this | 设置轮ææ»å¨çæ¶é´ï¼é»è®¤800毫ç§ï¼ |
start() | this | å¼å§è½®æ(主è¦é åçå½å¨æ使ç¨)ï¼æè ä½ æå¨æåå次å¯å¨ |
stop() | this | åæ¢è½®æ(主è¦é åçå½å¨æ使ç¨)ï¼æè ä½ éè¦æå¨æå |
setAdapter(T extends BannerAdapter) | this | 设置bannerçéé å¨ |
setAdapter(T extends BannerAdapter,boolean) | this | 设置bannerçéé å¨,æ¯å¦æ¯ææ éå¾ªç¯ |
setOrientation(@Orientation) | this | 设置bannerè½®ææ¹å(åç´oræ°´å¹³) |
setOnBannerListener(this) | this | 设置ç¹å»äºä»¶ï¼ä¸æ æ¯ä»0å¼å§ |
addOnPageChangeListener(this) | this | æ·»å viewpager2çæ»å¨çå¬ |
setPageTransformer(PageTransformer) | this | 设置viewpagerçåæ¢ææ |
addPageTransformer(PageTransformer) | this | æ·»å viewpagerçåæ¢ææï¼å¯ä»¥è®¾ç½®å¤ä¸ªï¼ |
setIndicator(Indicator) | this | 设置bannerè½®ææ示å¨(æä¾æbaseåæ¥å£ï¼å¯ä»¥èªå®ä¹) |
setIndicator(Indicator,boolean) | this | 设置æ示å¨ï¼ä¼ false代表ä¸å°æ示å¨æ·»å å°bannerä¸ï¼é åå¸å±æ件ï¼å¯ä»¥èªæåæ¥ï¼ |
setIndicatorSelectedColor(@ColorInt) | this | 设置æ示å¨éä¸é¢è² |
setIndicatorSelectedColorRes(@ColorRes) | this | 设置æ示å¨éä¸é¢è² |
setIndicatorNormalColor(@ColorInt) | this | 设置æ示å¨é»è®¤é¢è² |
setIndicatorNormalColorRes(@ColorRes) | this | 设置æ示å¨é»è®¤é¢è² |
setIndicatorGravity(@IndicatorConfig.Direction) | this | 设置æ示å¨ä½ç½®ï¼å·¦ï¼ä¸ï¼å³ï¼ |
setIndicatorSpace(int) | this | 设置æ示å¨ä¹é´çé´è· |
setIndicatorMargins(IndicatorConfig.Margins) | this | 设置æ示å¨çMargins |
setIndicatorWidth(int,int) | this | 设置æ示å¨éä¸åæªéä¸ç宽度ï¼ç´æ¥å½±åç»å¶æ示å¨çå¤§å° |
setIndicatorNormalWidth(int) | this | 设置æ示å¨æªéä¸ç宽度 |
setIndicatorSelectedWidth(int) | this | 设置æ示å¨éä¸ç宽度 |
setIndicatorRadius(int) | this | 设置æ示å¨åè§ï¼ä¸è¦åè§å¯ä»¥è®¾ç½®ä¸º0 |
setIndicatorHeight(int) | this | 设置æ示å¨é«åº¦ |
setBannerRound(float) | this | 设置banneråè§ï¼è¿æä¸ç§setBannerRound2æ¹æ³ï¼éè¦5.0以ä¸ï¼ |
setBannerGalleryEffect(int,int,float) | this | ç»å»ææ |
setBannerGalleryMZ(int,float) | this | é æææ |
setStartPosition(int) | this | 设置å¼å§çä½ç½® (éè¦å¨setAdapteræè setDatasä¹åè°ç¨æææå¦) |
setIndicatorPageChange() | this | 设置æ示å¨æ¹åçå¬ (ä¸è¬æ¯ä¸ºäºé åæ°æ®æä½ä½¿ç¨ï¼çæ åµèªå·±åæ¥) |
setCurrentItem() | this | 设置å½åä½ç½®ï¼ååç使ç¨ææä¸æ · |
addBannerLifecycleObserver() | this | ç»banneræ·»å çå½å¨æè§å¯è ï¼å é¨èªå¨ç®¡çbannerççå½å¨æ |
Attributeså±æ§
å¨bannerå¸å±æ件ä¸è°ç¨,å¦æä½ èªå®ä¹äºindicator请åå¥½å ¼å®¹å¤çã ä¸é¢çå±æ§å¹¶ä¸æ¯æ¯ä¸ªæ示å¨é½ç¨å¾å°ï¼æ以使ç¨æ¶è¦æ³¨æï¼
Attributes | format | describe |
---|---|---|
banner_loop_time | integer | è½®æé´éæ¶é´ï¼é»è®¤3000 |
banner_auto_loop | boolean | æ¯å¦èªå¨è½®æï¼é»è®¤true |
banner_infinite_loop | boolean | æ¯å¦æ¯ææ é循ç¯ï¼å³é¦å°¾ç´æ¥è¿æ¸¡ï¼ï¼é»è®¤true |
banner_orientation | enum | è½®ææ¹åï¼horizontalï¼é»è®¤ï¼ or vertical |
banner_radius | dimension | banneråè§åå¾ï¼é»è®¤0ï¼ä¸ç»å¶åè§ï¼ |
banner_indicator_normal_width | dimension | æ示å¨é»è®¤ç宽度ï¼é»è®¤5dp ï¼å¯¹RoundLinesIndicatoræ æï¼ |
banner_indicator_selected_width | dimension | æ示å¨éä¸ç宽度ï¼é»è®¤7dp |
banner_indicator_normal_color | color | æ示å¨é»è®¤é¢è²ï¼é»è®¤0x88ffffff |
banner_indicator_selected_color | color | æ示å¨éä¸é¢è²ï¼é»è®¤0x88000000 |
banner_indicator_space | dimension | æ示å¨ä¹é´çé´è·ï¼é»è®¤5dp ï¼å¯¹RoundLinesIndicatoræ æï¼ |
banner_indicator_gravity | dimension | æ示å¨ä½ç½®ï¼é»è®¤center |
banner_indicator_margin | dimension | æ示å¨çmargin,é»è®¤5dpï¼ä¸è½åä¸é¢çåæ¶ä½¿ç¨ |
banner_indicator_marginLeft | dimension | æ示å¨å·¦è¾¹çmargin |
banner_indicator_marginTop | dimension | æ示å¨ä¸è¾¹çmargin |
banner_indicator_marginRight | dimension | æ示å¨å³è¾¹çmargin |
banner_indicator_marginBottom | dimension | æ示å¨ä¸è¾¹çmargin |
banner_indicator_height | dimension | æ示å¨é«åº¦ï¼å¯¹CircleIndicatoræ æï¼ |
banner_indicator_radius | dimension | æ示å¨åè§ï¼å¯¹CircleIndicatoræ æï¼ |
banner_round_top_left | boolean | 设置è¦ç»å¶çbanneråè§æ¹åï¼å¦æé½ä¸è®¾ç½®é»è®¤å ¨é¨ï¼ |
banner_round_top_right | boolean | 设置è¦ç»å¶çbanneråè§æ¹åï¼å¦æé½ä¸è®¾ç½®é»è®¤å ¨é¨ï¼ |
banner_round_bottom_left | boolean | 设置è¦ç»å¶çbanneråè§æ¹åï¼å¦æé½ä¸è®¾ç½®é»è®¤å ¨é¨ï¼ |
banner_round_bottom_right | boolean | 设置è¦ç»å¶çbanneråè§æ¹åï¼å¦æé½ä¸è®¾ç½®é»è®¤å ¨é¨ï¼ |
使ç¨æ¥éª¤
以ä¸æä¾çæ¯æç®åçæ¥éª¤ï¼éè¦å¤æçæ ·å¼èªå·±å¯ä»¥èªå®ä¹
Step 1.ä¾èµbanner
Gradle
repositories {
maven { url "https://s01.oss.sonatype.org/content/groups/public" }
}
dependencies{
//2.1.0以åjcenterçä¾èµ
//implementation 'com.youth.banner:banner:2.1.0'
//ç°å¨Maven Central
implementation 'io.github.youth5201314:banner:2.2.3'
}
Step 2.æ·»å æéå°ä½ ç AndroidManifest.xml
<!-- if you want to load images from the internet -->
<uses-permission android:name="android.permission.INTERNET" />
Step 3.å¨å¸å±æ件ä¸æ·»å Bannerï¼å¯ä»¥è®¾ç½®èªå®ä¹å±æ§
ï¼ï¼ï¼æ¤æ¥éª¤å¯ä»¥çç¥ï¼å¯ä»¥ç´æ¥å¨Activityæè Fragmentä¸new Banner();
<com.youth.banner.Banner
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="é«åº¦èªå·±è®¾ç½®" />
Step 4.继æ¿BannerAdapterï¼åRecyclerViewçAdapterä¸æ ·ï¼å¦æä½ åªæ¯å¾çè½®æä¹å¯ä»¥ä½¿ç¨é»è®¤çï¼
ï¼ï¼ï¼æ¤æ¥éª¤å¯ä»¥çç¥ï¼å¾çè½®ææä¾æé»è®¤éé å¨ï¼å ¶ä»ç没ææä¾æ¯å 为大家çå¯åæ§è¦æ±ä¸ç¡®å®ï¼æ以ç´æ¥èªå®ä¹çæ¯è¾å¥½ã
/**
* èªå®ä¹å¸å±ï¼ä¸é¢æ¯å¸¸è§çå¾çæ ·å¼ï¼æ´å¤å®ç°å¯ä»¥çdemoï¼å¯ä»¥èªå·±éæåæ¥
*/
public class ImageAdapter extends BannerAdapter<DataBean, ImageAdapter.BannerViewHolder> {
public ImageAdapter(List<DataBean> mDatas) {
//设置æ°æ®ï¼ä¹å¯ä»¥è°ç¨banneræä¾çæ¹æ³,æè
èªå·±å¨adapterä¸å®ç°
super(mDatas);
}
//å建ViewHolderï¼å¯ä»¥ç¨viewTypeè¿ä¸ªå段æ¥åºåä¸åçViewHolder
@Override
public BannerViewHolder onCreateHolder(ViewGroup parent, int viewType) {
ImageView imageView = new ImageView(parent.getContext());
//注æï¼å¿
须设置为match_parentï¼è¿ä¸ªæ¯viewpager2强å¶è¦æ±ç
imageView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
return new BannerViewHolder(imageView);
}
@Override
public void onBindView(BannerViewHolder holder, DataBean data, int position, int size) {
holder.imageView.setImageResource(data.imageRes);
}
class BannerViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
public BannerViewHolder(@NonNull ImageView view) {
super(view);
this.imageView = view;
}
}
}
Step 5.Bannerå ·ä½æ¹æ³è°ç¨
public class BannerActivity extends AppCompatActivity {
public void useBanner() {
//--------------------------ç®å使ç¨-------------------------------
banner.addBannerLifecycleObserver(this)//æ·»å çå½å¨æè§å¯è
.setAdapter(new BannerExampleAdapter(DataBean.getTestData()))
.setIndicator(new CircleIndicator(this));
//âââââââââââââââââââââââââå¦æä½ æ³å·æï¼èååªæ¯å¾çè½®æââââââââââââââââââââââââ
banner.setAdapter(new BannerImageAdapter<DataBean>(DataBean.getTestData3()) {
@Override
public void onBindView(BannerImageHolder holder, DataBean data, int position, int size) {
//å¾çå è½½èªå·±å®ç°
Glide.with(holder.itemView)
.load(data.imageUrl)
.apply(RequestOptions.bitmapTransform(new RoundedCorners(30)))
.into(holder.imageView);
}
})
.addBannerLifecycleObserver(this)//æ·»å çå½å¨æè§å¯è
.setIndicator(new CircleIndicator(this));
//æ´å¤ä½¿ç¨æ¹æ³ä»ç»é
读ææ¡£ï¼æè
æ¥çdemo
}
}
Banner使ç¨ä¸ä¼åä½éª
å¦æä½ éè¦èèæ´å¥½çä½éªï¼å¯ä»¥ççä¸é¢ç代ç
Step 1.ï¼å¯éï¼çå½å¨ææ¹åæ¶
public class BannerActivity {
//æ¹æ³ä¸ï¼èªå·±æ§å¶bannerççå½å¨æ
@Override
protected void onStart() {
super.onStart();
//å¼å§è½®æ
banner.start();
}
@Override
protected void onStop() {
super.onStop();
//åæ¢è½®æ
banner.stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
//éæ¯
banner.destroy();
}
//æ¹æ³äºï¼è°ç¨bannerçaddBannerLifecycleObserver()æ¹æ³ï¼è®©bannerèªå·±æ§å¶
protected void onCreate(Bundle savedInstanceState) {
//æ·»å çå½å¨æè§å¯è
banner.addBannerLifecycleObserver(this);
}
}
常è§é®é¢ï¼æ¶å½è¢«åå¤è¯¢é®çé®é¢ï¼
-
ç½ç»å¾çå è½½ä¸åºæ¥ï¼
banneræ¬èº«ä¸æä¾å¾çå è½½åè½ï¼é¦å 确认banneræ¬èº«ä½¿ç¨æ¯å¦æ£ç¡®ï¼å ·ä½åèdemoï¼ ç¶å请æ£æ¥ä½ çå¾çå è½½æ¡æ¶æè ç½ç»è¯·æ±æ¡æ¶ï¼æå¡ç«¯ä¹å¯è½å äºhttpså®å ¨è®¤è¯ï¼æ¯çä¸æ¯å¦æ¥æè¯ä¹¦ç¸å ³é误
-
æä¹å®ç°è§é¢è½®æï¼
demoä¸æå®ç°ç±»ä¼¼æ·å®åå详æ çææï¼ç¬¬ä¸ä¸ªæ¾è§é¢ï¼åé¢çæ¾çæ¯å¾çï¼å¹¶ä¸å¯ä»¥è®¾ç½®é¦å°¾ä¸è½æ»å¨ã å 为大家使ç¨çææ¾å¨ä¸ä¸æ ·ä¸å¡ç¯å¢ä¹ä¸åï¼å ·ä½æ åµèªå·±ææ¡ï¼demoå°±æ¯ç»ä¸ä¸ªæè·¯åï¼å¯ä»¥åèåä¿®æ¹
-
ææ³æå®è½®æå¼å§çä½ç½®ï¼
ç°å¨æä¾äºsetStartPosition()æ¹æ³ï¼å¨sheAdapteråsetDatasç´æ¥è°ç¨ä¸æ¬¡å°±è¡äºï¼å½ç¶setAdapteråéè¿setCurrentItem设置ä¹è¡
-
ç¶æ§ä»¶æ»å¨æ¶ï¼banneråæ¢ä¼è·åç¦ç¹ï¼ç¶åèªå¨å ¨é¨æ¾ç¤ºãä¸æ³è®©bannerè·åç¦ç¹å¯ä»¥ç»ç¶æ§ä»¶å ä¸ï¼
//bannerä¹ä¸å®è¦ç¨ææ°çå¦ï¼ android:focusable="true" android:focusableInTouchMode="true"
-
æä¹è®¾ç½®åè§ï¼ 1ãè°ç¨æä¾çæ¹æ³æè èªå®ä¹å±æ§è¿è¡è®¾ç½®ï¼è¿é设置çæ¯banneræ¬èº«çåè§ï¼ä¸æ¯è½®æå viewçåè§ 2ãå¨adapterä¸å¯¹èªå®ä¹çviewè¿è¡èªå·±å®ç°ï¼å°±æ¿å¾ç举ä¾ï¼å¯ä»¥èªå·±å®ä¹ä¸ä¸ªåè§çImageViewæ§ä»¶ï¼æè 使ç¨glide渲æé½è¡ã请举ä¸åä¸ï¼viewé½èªå®ä¹äºè¿æä»ä¹ä¸è½æ¹çï¼
Thanks
èç³»æ¹å¼
- æç个人微åï¼https://weibo.com/u/3013494003 æå ´è¶£çä¹å¯ä»¥å ³æ³¨ï¼å¤§å®¶ä¸èµ·äº¤æµ
- æé®é¢å¯ä»¥å 群大家ä¸èµ·äº¤æµï¼å¦æä½ è§å¾å¯¹ä½ æ帮å©å¯ä»¥æ«æä¸é¢æ¯ä»å®äºç»´ç éææèµä¸å¦ï¼
æ´æ°è¯´æ
Top Related Projects
GitHub notifications alike app for Django
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot