Skip to content

Commit 6490b85

Browse files
authored
Merge pull request #132 from liudaolunboluo/master
新增配置界面,修改部分问题
2 parents a751149 + eb064e6 commit 6490b85

File tree

7 files changed

+382
-85
lines changed

7 files changed

+382
-85
lines changed

resources/META-INF/plugin.xml

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<idea-plugin>
2-
<id>YapiUpload</id>
3-
<name>YapiUpload</name>
4-
<version>1.8.2</version>
5-
<vendor email="[email protected]" url="http://www.qbb6.com">QBB</vendor>
2+
<id>YapiUpload</id>
3+
<name>YapiUpload</name>
4+
<version>1.8.2</version>
5+
<vendor email="[email protected]" url="http://www.qbb6.com">QBB</vendor>
66

7-
<description><![CDATA[
7+
<description><![CDATA[
88
upload api to yapi<br>
99
<em>support dubbo api and api upload</em>
1010
]]></description>
1111

12-
<change-notes><![CDATA[
12+
<change-notes><![CDATA[
1313
<a href="https://github.com/diwand/YapiIdeaUploadPlugin">how to use</a> <br>
1414
1.8.2:<br> java type convert to json type <br>
1515
1.8.1:<br> support idea 2020 <br>
@@ -185,34 +185,41 @@
185185
- Support user-defined classification < br >
186186
187187
]]>
188-
</change-notes>
188+
</change-notes>
189189

190-
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
191-
<idea-version since-build="145.0"/>
190+
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
191+
<idea-version since-build="145.0"/>
192192

193-
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
194-
on how to target different products -->
195-
<!-- uncomment to enable plugin in all products
196-
<depends>com.intellij.modules.lang</depends>
197-
-->
193+
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
194+
on how to target different products -->
195+
<!-- uncomment to enable plugin in all products
196+
<depends>com.intellij.modules.lang</depends>
197+
-->
198+
199+
<depends>com.intellij.modules.platform</depends>
200+
<depends>com.intellij.modules.lang</depends>
201+
<depends>com.intellij.modules.java</depends>
202+
203+
<extensions defaultExtensionNs="com.intellij">
204+
<!-- Add your extensions here -->
205+
</extensions>
198206

199-
<depends>com.intellij.modules.platform</depends>
200-
<depends>com.intellij.modules.lang</depends>
201-
<depends>com.intellij.modules.java</depends>
202207

203208
<extensions defaultExtensionNs="com.intellij">
204-
<!-- Add your extensions here -->
209+
<applicationConfigurable instance="com.qbb.component.ConfigComponent"/>
210+
<applicationService serviceImplementation="com.qbb.component.ConfigPersistence"
211+
serviceInterface="com.qbb.component.ConfigPersistence"/>
205212
</extensions>
206213

207-
<actions>
208-
<!-- Add your actions here -->
209-
<action id="UploadToYapi" class="com.qbb.interaction.UploadToYapi" text="UploadToYapi"
210-
description="UploadToYapi">
211-
<add-to-group group-id="EditorLangPopupMenu" anchor="first"/>
212-
<keyboard-shortcut keymap="$default" first-keystroke="alt u"/>
213-
</action>
214-
</actions>
214+
<actions>
215+
<!-- Add your actions here -->
216+
<action id="UploadToYapi" class="com.qbb.interaction.UploadToYapi" text="UploadToYapi"
217+
description="UploadToYapi">
218+
<add-to-group group-id="EditorLangPopupMenu" anchor="first"/>
219+
<keyboard-shortcut keymap="$default" first-keystroke="alt u"/>
220+
</action>
221+
</actions>
215222

216-
<depends>com.intellij.modules.java</depends>
223+
<depends>com.intellij.modules.java</depends>
217224

218225
</idea-plugin>

src/com/qbb/build/BuildJsonForYapi.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,16 @@ public static YapiApiDTO actionPerformed(PsiClass selectedClass, PsiMethod psiMe
139139
YapiApiDTO yapiApiDTO = new YapiApiDTO();
140140
// 获得路径
141141
StringBuilder path = new StringBuilder();
142-
142+
//获得Controller上的API注解
143+
String apiValue = PsiAnnotationSearchUtil.getPsiParameterAnnotationParam(selectedClass, SwaggerConstants.API,"tags");
144+
if(StringUtils.isNotBlank(apiValue)){
145+
yapiApiDTO.setMenu(apiValue);
146+
}else{
147+
apiValue = PsiAnnotationSearchUtil.getPsiParameterAnnotationValue(selectedClass, SwaggerConstants.API);
148+
if(StringUtils.isNotBlank(apiValue)){
149+
yapiApiDTO.setMenu(apiValue);
150+
}
151+
}
143152
// 获取类上面的RequestMapping 中的value
144153
PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(selectedClass, SpringMVCConstant.RequestMapping);
145154
if (psiAnnotation != null) {
@@ -179,7 +188,9 @@ public static YapiApiDTO actionPerformed(PsiClass selectedClass, PsiMethod psiMe
179188
String[] results = psiReference.resolve().getText().split("=");
180189
DesUtil.addPath(path, results[results.length - 1].split(";")[0].replace("\"", "").trim());
181190
yapiApiDTO.setTitle(DesUtil.getUrlReFerenceRDesc(psiReference.resolve().getText()));
182-
yapiApiDTO.setMenu(DesUtil.getMenu(psiReference.resolve().getText()));
191+
if(StringUtils.isBlank(yapiApiDTO.getMenu())){
192+
yapiApiDTO.setMenu(DesUtil.getMenu(psiReference.resolve().getText()));
193+
}
183194
yapiApiDTO.setStatus(DesUtil.getStatus(psiReference.resolve().getText()));
184195
yapiApiDTO.setDesc("<pre><code> " + psiReference.resolve().getText() + " </code></pre> <hr>");
185196
}
@@ -240,7 +251,9 @@ public static YapiApiDTO actionPerformed(PsiClass selectedClass, PsiMethod psiMe
240251
String[] results = psiReference.resolve().getText().split("=");
241252
DesUtil.addPath(path, results[results.length - 1].split(";")[0].replace("\"", "").trim());
242253
yapiApiDTO.setTitle(DesUtil.getUrlReFerenceRDesc(psiReference.resolve().getText()));
243-
yapiApiDTO.setMenu(DesUtil.getMenu(psiReference.resolve().getText()));
254+
if(StringUtils.isBlank(yapiApiDTO.getMenu())){
255+
yapiApiDTO.setMenu(DesUtil.getMenu(psiReference.resolve().getText()));
256+
}
244257
yapiApiDTO.setStatus(DesUtil.getStatus(psiReference.resolve().getText()));
245258
if (!Strings.isNullOrEmpty(psiReference.resolve().getText())) {
246259
String refernceDesc = psiReference.resolve().getText().replace("<", "&lt;").replace(">", "&gt;");
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
package com.qbb.component;
2+
3+
import com.intellij.notification.Notification;
4+
import com.intellij.notification.NotificationDisplayType;
5+
import com.intellij.notification.NotificationGroup;
6+
import com.intellij.notification.Notifications;
7+
import com.intellij.openapi.application.ApplicationManager;
8+
import com.intellij.openapi.components.ApplicationComponent;
9+
import com.intellij.openapi.components.BaseComponent;
10+
import com.intellij.openapi.options.Configurable;
11+
import com.intellij.openapi.options.ConfigurationException;
12+
import com.intellij.openapi.options.SearchableConfigurable;
13+
import com.intellij.openapi.ui.MessageType;
14+
import com.intellij.openapi.ui.Messages;
15+
import com.qbb.dto.ConfigDTO;
16+
import org.apache.commons.lang.StringUtils;
17+
import org.jetbrains.annotations.Nls;
18+
import org.jetbrains.annotations.NotNull;
19+
import org.jetbrains.annotations.Nullable;
20+
import org.jetbrains.jps.api.CmdlineRemoteProto;
21+
22+
import javax.swing.*;
23+
import javax.swing.border.Border;
24+
import java.awt.*;
25+
import java.awt.event.ActionListener;
26+
import java.util.UUID;
27+
28+
/**
29+
* @author zhangyunfan
30+
* @version 1.0
31+
* @ClassName: ConfigComponent
32+
* @Description: 配置界面
33+
* @date 2020/12/25
34+
*/
35+
public class ConfigComponent implements SearchableConfigurable {
36+
37+
private ConfigPersistence configPersistence = ConfigPersistence.getInstance();
38+
39+
private static final int TEXT_AREA_ROWS = 1;
40+
41+
private static final int TEXT_AREA_COLUMNS = 5;
42+
43+
private static final int TEXT_AREA_FONTSIZE = 15;
44+
45+
private JPanel panel;
46+
47+
private JLabel yapiJLabel;
48+
private JTextField yapiTextArea;
49+
50+
private JLabel projectTokenJLabel;
51+
private JTextField projectTokenTextArea;
52+
53+
private JLabel projectIdJLabel;
54+
private JTextField projectIdTextArea;
55+
56+
private JLabel projectTypeJLabel;
57+
private JComboBox projectTypeTextArea;
58+
59+
@NotNull
60+
@Override
61+
public String getId() {
62+
return UUID.randomUUID().toString().replaceAll("-", "");
63+
}
64+
65+
@Nls(capitalization = Nls.Capitalization.Title)
66+
@Override
67+
public String getDisplayName() {
68+
return "YapiUpload";
69+
}
70+
71+
@Nullable
72+
@Override
73+
public JComponent createComponent() {
74+
panel = new JPanel();
75+
GridBagLayout gridBagLayout = new GridBagLayout();
76+
panel.setLayout(gridBagLayout);
77+
//实例化这个对象用来对组件进行管理
78+
GridBagConstraints gridBagConstraints = new GridBagConstraints();
79+
gridBagConstraints.fill = GridBagConstraints.BOTH;
80+
gridBagConstraints.insets = new Insets(10, 10, 0, 0);
81+
Border border = BorderFactory.createLineBorder(Color.BLACK);
82+
yapiJLabel = new JLabel("yapi地址:");
83+
yapiTextArea = new JTextField(configPersistence.getConfigDTO() == null ? "" : configPersistence.getConfigDTO().getYapiUrl());
84+
yapiTextArea.setBorder(border);
85+
yapiTextArea.setFont(new Font(null, Font.PLAIN, TEXT_AREA_FONTSIZE));
86+
yapiTextArea.setSize(10, 10);
87+
yapiJLabel.setAlignmentY(yapiJLabel.LEFT_ALIGNMENT);
88+
89+
projectTokenJLabel = new JLabel("项目Token:");
90+
projectTokenTextArea = new JTextField(configPersistence.getConfigDTO() == null ? "" : configPersistence.getConfigDTO().getProjectToken());
91+
projectTokenTextArea.setBorder(border);
92+
projectTokenTextArea.setFont(new Font(null, Font.PLAIN, TEXT_AREA_FONTSIZE));
93+
projectTokenJLabel.setAlignmentY(projectTokenJLabel.LEFT_ALIGNMENT);
94+
95+
projectIdJLabel = new JLabel("项目ID:");
96+
projectIdTextArea = new JTextField(configPersistence.getConfigDTO() == null ? "" : configPersistence.getConfigDTO().getProjectId());
97+
projectIdTextArea.setBorder(border);
98+
projectIdTextArea.setFont(new Font(null, Font.PLAIN, TEXT_AREA_FONTSIZE));
99+
projectIdJLabel.setAlignmentY(projectIdJLabel.LEFT_ALIGNMENT);
100+
101+
projectTypeJLabel = new JLabel("项目类型:");
102+
String[] select = {"api", "dubbo"};
103+
projectTypeTextArea = new JComboBox();
104+
projectTypeTextArea.setModel(new DefaultComboBoxModel(select));
105+
projectTypeTextArea.setBounds(15, 15, 100, 25);
106+
projectTypeJLabel.setAlignmentY(projectTypeJLabel.LEFT_ALIGNMENT);
107+
108+
gridBagConstraints.gridx = 1;
109+
gridBagConstraints.gridy = 4;
110+
gridBagConstraints.gridwidth = 1;
111+
gridBagConstraints.gridheight = 1;
112+
gridBagLayout.setConstraints(yapiJLabel, gridBagConstraints);
113+
gridBagConstraints.gridx = 20;
114+
gridBagConstraints.gridy = 4;
115+
gridBagConstraints.gridwidth = 1;
116+
gridBagConstraints.gridheight = 1;
117+
gridBagLayout.setConstraints(yapiTextArea, gridBagConstraints);
118+
119+
120+
gridBagConstraints.gridx = 1;
121+
gridBagConstraints.gridy = 8;
122+
gridBagConstraints.gridwidth = 1;
123+
gridBagConstraints.gridheight = 1;
124+
gridBagLayout.setConstraints(projectTokenJLabel, gridBagConstraints);
125+
gridBagConstraints.gridx = 20;
126+
gridBagConstraints.gridy = 8;
127+
gridBagConstraints.gridwidth = 1;
128+
gridBagConstraints.gridheight = 1;
129+
gridBagLayout.setConstraints(projectTokenTextArea, gridBagConstraints);
130+
131+
132+
gridBagConstraints.gridx = 1;
133+
gridBagConstraints.gridy = 10;
134+
gridBagConstraints.gridwidth = 1;
135+
gridBagConstraints.gridheight = 1;
136+
gridBagLayout.setConstraints(projectIdJLabel, gridBagConstraints);
137+
gridBagConstraints.gridx = 20;
138+
gridBagConstraints.gridy = 10;
139+
gridBagConstraints.gridwidth = 1;
140+
gridBagConstraints.gridheight = 1;
141+
gridBagLayout.setConstraints(projectIdTextArea, gridBagConstraints);
142+
143+
gridBagConstraints.gridx = 1;
144+
gridBagConstraints.gridy = 12;
145+
gridBagConstraints.gridwidth = 1;
146+
gridBagConstraints.gridheight = 1;
147+
gridBagLayout.setConstraints(projectTypeJLabel, gridBagConstraints);
148+
gridBagConstraints.gridx = 20;
149+
gridBagConstraints.gridy = 12;
150+
gridBagConstraints.gridwidth = 1;
151+
gridBagConstraints.gridheight = 1;
152+
gridBagLayout.setConstraints(projectTypeTextArea, gridBagConstraints);
153+
154+
panel.add(projectTypeJLabel);
155+
panel.add(projectTypeTextArea);
156+
panel.add(projectIdJLabel);
157+
panel.add(projectIdTextArea);
158+
panel.add(projectTokenJLabel);
159+
panel.add(projectTokenTextArea);
160+
panel.add(yapiJLabel);
161+
panel.add(yapiTextArea);
162+
163+
return panel;
164+
}
165+
166+
@Override
167+
public boolean isModified() {
168+
if (configPersistence.getConfigDTO() == null) {
169+
return true;
170+
}
171+
//当用户修改配置参数后,在点击“OK”“Apply”按钮前,框架会自动调用该方法,判断是否有修改,进而控制按钮“OK”“Apply”的是否可用。
172+
return !StringUtils.equals(yapiTextArea.getText(), configPersistence.getConfigDTO().getYapiUrl())
173+
|| !StringUtils.equals(projectTokenTextArea.getText(), configPersistence.getConfigDTO().getProjectToken())
174+
|| !StringUtils.equals(projectIdTextArea.getText(), configPersistence.getConfigDTO().getProjectId())
175+
|| !StringUtils.equals((String) projectTypeTextArea.getSelectedItem(), configPersistence.getConfigDTO().getProjectType());
176+
}
177+
178+
@Override
179+
public void apply() throws ConfigurationException {
180+
//用户点击“OK”或“Apply”按钮后会调用该方法,通常用于完成配置信息持久化。
181+
ConfigDTO configDTO = new ConfigDTO();
182+
configDTO.setYapiUrl(yapiTextArea.getText());
183+
configDTO.setProjectToken(projectTokenTextArea.getText());
184+
configDTO.setProjectId(projectIdTextArea.getText());
185+
configDTO.setProjectType((String) projectTypeTextArea.getSelectedItem());
186+
configPersistence.setConfigDTO(configDTO);
187+
}
188+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.qbb.component;
2+
3+
import com.intellij.openapi.components.PersistentStateComponent;
4+
import com.intellij.openapi.components.ServiceManager;
5+
import com.intellij.openapi.components.State;
6+
import com.intellij.openapi.components.Storage;
7+
import com.qbb.dto.ConfigDTO;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.jetbrains.annotations.Nullable;
10+
11+
import javax.lang.model.element.Element;
12+
13+
/**
14+
* @author zhangyunfan
15+
* @version 1.0
16+
* @ClassName: ConfigPersistence
17+
* @Description: 配置持久化
18+
* @date 2020/12/25
19+
*/
20+
@State(name = "yapiUpload", storages = {@Storage(value = "$APP_CONFIG$/yapiUpload.xml")})
21+
public class ConfigPersistence implements PersistentStateComponent<ConfigDTO> {
22+
23+
24+
public ConfigDTO getConfigDTO() {
25+
return configDTO;
26+
}
27+
28+
public void setConfigDTO(ConfigDTO configDTO) {
29+
this.configDTO = configDTO;
30+
}
31+
32+
private ConfigDTO configDTO;
33+
34+
public static ConfigPersistence getInstance(){
35+
return ServiceManager.getService(ConfigPersistence.class);
36+
}
37+
38+
39+
@Nullable
40+
@Override
41+
public ConfigDTO getState() {
42+
return this.configDTO;
43+
}
44+
45+
@Override
46+
public void loadState(@NotNull ConfigDTO element) {
47+
this.configDTO = element;
48+
}
49+
}

src/com/qbb/constant/SwaggerConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ public interface SwaggerConstants {
1111
String API_MODEL_PROPERTY = "io.swagger.annotations.ApiModelProperty";
1212

1313
String API_PARAM = "io.swagger.annotations.ApiParam";
14+
15+
String API="io.swagger.annotations.Api";
1416
}

0 commit comments

Comments
 (0)