Browse Source

REPORT-78815【运营产品化二期】详细信息里的超链无法点击

REPORT-78825【运营产品化二期】二级页面点击tab名返回,对应的名称显示颜色不对
1、修改ui
2、修改交互
feature/x
Link.Zhao 2 years ago
parent
commit
9963592c7d
  1. 35
      designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java
  2. 4
      designer-base/src/main/java/com/fr/design/utils/LinkStrUtils.java
  3. 32
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java
  4. 34
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/model/TemplateResourceDetail.java
  5. 114
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateResourceDetailPane.java

35
designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java

@ -22,7 +22,12 @@ import static com.fr.design.utils.LinkStrUtils.LABEL;
* Created by hades on 2020/10/23 * Created by hades on 2020/10/23
*/ */
public class MessageWithLink extends JEditorPane { public class MessageWithLink extends JEditorPane {
private static final String HTML_BODY = "<body";
private static final String HTML_STYLE_FORMAT = " style=\"%s\"";
/** /**
* 直接放入 html 内容 * 直接放入 html 内容
* 如果有超链接标签 <a href=""></a> 的话将会自动点击匹配 url * 如果有超链接标签 <a href=""></a> 的话将会自动点击匹配 url
@ -69,6 +74,34 @@ public class MessageWithLink extends JEditorPane {
this(frontMessage, linkName, link, backMessage, color, font, LABEL.getForeground()); this(frontMessage, linkName, link, backMessage, color, font, LABEL.getForeground());
} }
public MessageWithLink(String htmlText, Font font) {
this(setHtmlFont(htmlText, font));
}
/**
* 将指定的字体赋给html文本
* 任何失败返回原html文本
* */
private static String setHtmlFont(String htmlText, Font font) {
try {
int bodyIndex = htmlText.indexOf(HTML_BODY);
StringBuilder sb = new StringBuilder();
String left = htmlText.substring(0, bodyIndex + HTML_BODY.length());
String right = htmlText.substring(bodyIndex + HTML_BODY.length());
sb.append(left);
sb.append(String.format(HTML_STYLE_FORMAT, LinkStrUtils.generateStyle(Color.WHITE, font, Color.BLACK)));
sb.append(right);
return sb.toString();
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e, e.getMessage());
}
return htmlText;
}
public MessageWithLink(String frontMessage, String linkName, String link, String backMessage, Color backgroundColor, Font font, Color fontColor) { public MessageWithLink(String frontMessage, String linkName, String link, String backMessage, Color backgroundColor, Font font, Color fontColor) {
super("text/html", "<html><body style=\"" + LinkStrUtils.generateStyle(backgroundColor, font, fontColor) + "\">" + frontMessage + "<a href=\"" + link + "\">" + linkName + "</a>" + backMessage + "</body></html>"); super("text/html", "<html><body style=\"" + LinkStrUtils.generateStyle(backgroundColor, font, fontColor) + "\">" + frontMessage + "<a href=\"" + link + "\">" + linkName + "</a>" + backMessage + "</body></html>");

4
designer-base/src/main/java/com/fr/design/utils/LinkStrUtils.java

@ -42,6 +42,10 @@ public class LinkStrUtils {
return "<a href=\"" + link + "\">" + text + "</a>"; return "<a href=\"" + link + "\">" + text + "</a>";
} }
public static String generateLinkTagWithoutUnderLine(String link, String text) {
return "<a style=\"text-decoration:none;\" href=\"" + link + "\">" + text + "</a>";
}
public static String generateStyle(Color backgroundColor, Font font, Color fontColor) { public static String generateStyle(Color backgroundColor, Font font, Color fontColor) {

32
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java

@ -438,11 +438,7 @@ public class AlphaFineFrame extends JFrame {
labelPane.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20)); labelPane.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20));
labelPane.setBackground(Color.WHITE); labelPane.setBackground(Color.WHITE);
labelContentPane = new JPanel(new BorderLayout()); labelContentPane = new JPanel(new BorderLayout());
tabLabel = new UILabel(PRODUCT_NEWS); tabLabel = createTabLabel(PRODUCT_NEWS);
tabLabel.setForeground(AlphaFineConstants.FOREGROUND_COLOR_6);
tabLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
tabLabel.setPreferredSize(new Dimension(60, 30));
tabLabel.setForeground(AlphaFineConstants.LABEL_SELECTED);
labelWestPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); labelWestPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
labelWestPane.add(tabLabel); labelWestPane.add(tabLabel);
labelContentPane.add(labelWestPane, BorderLayout.WEST); labelContentPane.add(labelWestPane, BorderLayout.WEST);
@ -491,6 +487,14 @@ public class AlphaFineFrame extends JFrame {
return showPane; return showPane;
} }
private UILabel createTabLabel(String labelName) {
UILabel label = new UILabel(labelName);
label.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
label.setPreferredSize(new Dimension(60, 30));
label.setForeground(AlphaFineConstants.LABEL_SELECTED);
return label;
}
public JPanel getLabelWestPane() { public JPanel getLabelWestPane() {
return labelWestPane; return labelWestPane;
} }
@ -588,6 +592,7 @@ public class AlphaFineFrame extends JFrame {
private void refreshLabelPane() { private void refreshLabelPane() {
labelWestPane.removeAll(); labelWestPane.removeAll();
tabLabel.setForeground(AlphaFineConstants.LABEL_SELECTED);
labelWestPane.add(tabLabel); labelWestPane.add(tabLabel);
} }
@ -696,17 +701,20 @@ public class AlphaFineFrame extends JFrame {
if (searchResultList != null) { if (searchResultList != null) {
searchResultList.requestFocus(); searchResultList.requestFocus();
} }
boolean hasSearchResult = true;
if (selectedTab.getCellType() == CellType.PRODUCT_NEWS) {
hasSearchResult = productNewsSearchWorkerManager.hasSearchResult();
} else {
hasSearchResult = currentSearchWorkerManager.hasSearchResult();
}
if (!hasSearchResult) { if (!hasSearchResult()) {
showResult(CellType.NO_RESULT.getFlagStr4None()); showResult(CellType.NO_RESULT.getFlagStr4None());
} }
}
private boolean hasSearchResult() {
if (selectedTab.getCellType() == CellType.PRODUCT_NEWS) {
return productNewsSearchWorkerManager.hasSearchResult();
} else if (selectedTab.getCellType() == CellType.TEMPLATE_SHOP) {
return templateResourceSearchWorkerManager.hasSearchResult();
} else {
return currentSearchWorkerManager.hasSearchResult();
}
} }
private void initSearchTextField() { private void initSearchTextField() {

34
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/model/TemplateResourceDetail.java

@ -23,11 +23,13 @@ public class TemplateResourceDetail {
private final TemplateResource root; private final TemplateResource root;
private String info; private String info;
private String vendor; private String vendor;
private String htmlText;
private List<String> detailInfo; private List<String> detailInfo;
private String[] tagsId; private String[] tagsId;
private List<String> tagsName; private List<String> tagsName;
private double price; private double price;
private String parentPkgName = ""; private String parentPkgName = "";
private String parentPkgUrl;
private String resourceUrl; private String resourceUrl;
public static final String ID = "id"; public static final String ID = "id";
@ -38,6 +40,7 @@ public class TemplateResourceDetail {
public static final String PRICE = "price"; public static final String PRICE = "price";
public static final String NAME = "name"; public static final String NAME = "name";
public static final String PARENT_NAME = "parentName"; public static final String PARENT_NAME = "parentName";
public static final String PARENT_URL = "parentUrl";
public static final String TAGS_NAME = "tagsName"; public static final String TAGS_NAME = "tagsName";
public static final String URL = "url"; public static final String URL = "url";
@ -88,6 +91,16 @@ public class TemplateResourceDetail {
return tagsName; return tagsName;
} }
public String getTagsString() {
StringBuilder sb = new StringBuilder();
if (tagsName != null) {
for (String tag : tagsName) {
sb.append(tag + " ");
}
}
return sb.toString();
}
public void setTagsName(List<String> tagsName) { public void setTagsName(List<String> tagsName) {
this.tagsName = tagsName; this.tagsName = tagsName;
} }
@ -120,6 +133,21 @@ public class TemplateResourceDetail {
this.resourceUrl = resourceUrl; this.resourceUrl = resourceUrl;
} }
public String getHtmlText() {
return htmlText;
}
public void setHtmlText(String htmlText) {
this.htmlText = htmlText;
}
public String getParentPkgUrl() {
return parentPkgUrl;
}
public void setParentPkgUrl(String parentPkgUrl) {
this.parentPkgUrl = parentPkgUrl;
}
public static TemplateResourceDetail createByTemplateResource(TemplateResource root) { public static TemplateResourceDetail createByTemplateResource(TemplateResource root) {
return Builder.buildByResource(root); return Builder.buildByResource(root);
@ -141,11 +169,12 @@ public class TemplateResourceDetail {
JSONObject resource = embedResources.getJSONObject(i); JSONObject resource = embedResources.getJSONObject(i);
if (resourceId.equals(resource.getString(ID))) { if (resourceId.equals(resource.getString(ID))) {
detail.setInfo(resource.getString(INFO)); detail.setInfo(resource.getString(INFO));
detail.setDetailInfo(parseDetailInfo(resource.getString(DETAIL_INFO))); detail.setHtmlText(resource.getString(DETAIL_INFO));
detail.setVendor(resource.getString(VENDOR)); detail.setVendor(resource.getString(VENDOR));
detail.setPrice(resource.getDouble(PRICE)); detail.setPrice(resource.getDouble(PRICE));
detail.setResourceUrl(resource.getString(URL)); detail.setResourceUrl(resource.getString(URL));
detail.setParentPkgName(resource.getString(PARENT_NAME)); detail.setParentPkgName(resource.getString(PARENT_NAME));
detail.setParentPkgUrl(resource.getString(PARENT_URL));
detail.setTagsName(Arrays.asList(resource.getString(TAGS_NAME).split(","))); detail.setTagsName(Arrays.asList(resource.getString(TAGS_NAME).split(",")));
break; break;
} }
@ -162,7 +191,7 @@ public class TemplateResourceDetail {
// 1请求详细信息 // 1请求详细信息
JSONObject info = helper.getTemplateInfoById(resourceId); JSONObject info = helper.getTemplateInfoById(resourceId);
detail.setInfo(info.getString(INFO)); detail.setInfo(info.getString(INFO));
detail.setDetailInfo(parseDetailInfo(info.getString(DETAIL_INFO))); detail.setHtmlText(info.getString(DETAIL_INFO));
detail.setVendor(info.getString(VENDOR)); detail.setVendor(info.getString(VENDOR));
detail.setTagsId(info.getString(TAGS_ID).split(",")); detail.setTagsId(info.getString(TAGS_ID).split(","));
detail.setPrice(info.getDouble(PRICE)); detail.setPrice(info.getDouble(PRICE));
@ -172,6 +201,7 @@ public class TemplateResourceDetail {
JSONObject parentPkginfo = helper.getTemplateParentPackageByTemplateId(resourceId); JSONObject parentPkginfo = helper.getTemplateParentPackageByTemplateId(resourceId);
if (parentPkginfo != null) { if (parentPkginfo != null) {
detail.setParentPkgName(parentPkginfo.getString(NAME)); detail.setParentPkgName(parentPkginfo.getString(NAME));
detail.setParentPkgUrl(FineMarketClientHelper.getInstance().getTemplateUrlById(parentPkginfo.getString(ID)));
} }
// 3请求标签信息 // 3请求标签信息

114
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateResourceDetailPane.java

@ -1,6 +1,7 @@
package com.fr.design.mainframe.alphafine.preview; package com.fr.design.mainframe.alphafine.preview;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.link.MessageWithLink;
import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineConstants;
@ -8,12 +9,14 @@ import com.fr.design.mainframe.alphafine.action.StartUseAction;
import com.fr.design.mainframe.alphafine.component.TemplateResourceImagePanel; import com.fr.design.mainframe.alphafine.component.TemplateResourceImagePanel;
import com.fr.design.mainframe.alphafine.model.TemplateResourceDetail; import com.fr.design.mainframe.alphafine.model.TemplateResourceDetail;
import com.fr.design.utils.BrowseUtils; import com.fr.design.utils.BrowseUtils;
import com.fr.design.utils.LinkStrUtils;
import com.fr.stable.StringUtils;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.SwingConstants; import javax.swing.SwingUtilities;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FlowLayout; import java.awt.FlowLayout;
@ -22,7 +25,6 @@ import java.awt.Graphics2D;
import java.awt.RenderingHints; import java.awt.RenderingHints;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.List;
public class TemplateResourceDetailPane extends JPanel { public class TemplateResourceDetailPane extends JPanel {
@ -37,12 +39,12 @@ public class TemplateResourceDetailPane extends JPanel {
private static final int IMAGE_HEIGHT = 170; private static final int IMAGE_HEIGHT = 170;
private static final int IMAGE_WIDTH= 310; private static final int IMAGE_WIDTH = 310;
private static final int SCROLL_PANE_WIDTH = 315; private static final int SCROLL_PANE_WIDTH = 315;
private static final int SCROLL_PANE_HEIGHT = 135; private static final int SCROLL_PANE_HEIGHT = 135;
private static final int CONTENT_PANE_WIDTH = 320; private static final int CONTENT_PANE_WIDTH = 320;
private static final int CONTENT_PANE_HEIGHT = 180; private static final int CONTENT_PANE_HEIGHT = 180;
private static final int DETAIL_PANE_HEIGHT = 110; private static final int DETAIL_PANE_HEIGHT = 95;
private static final int TEXT_SCROLL_PANE_HEIGHT = 500; private static final int TEXT_SCROLL_PANE_HEIGHT = 500;
private static final int PANE_WIDTH = 635; private static final int PANE_WIDTH = 635;
private static final int BUTTON_WIDTH = 68; private static final int BUTTON_WIDTH = 68;
@ -64,26 +66,36 @@ public class TemplateResourceDetailPane extends JPanel {
private static final Color INFO_PANE_FOREGROUND = new Color(0x5b5b5c); private static final Color INFO_PANE_FOREGROUND = new Color(0x5b5b5c);
private static final Color MORE_INFO_LINK = new Color(0x419bf9); private static final Color MORE_INFO_LINK = new Color(0x419bf9);
private static final String HTML_FORMAT = "<html><body style=\"font-size: 12pt\">%s</body></html>";
private static final String DETAIL_INFO_HTML_FORMAT = "<html><body style=\"font-size: 12pt\"><h3>" + DETAIL_INFO + "</h3>%s</body></html>";
private static final String HTML_P_TAG_FORMAT = "<p style=\"margin-top:5pt;\">%s</p>";
public TemplateResourceDetailPane(TemplateResourceDetail detail) { public TemplateResourceDetailPane(TemplateResourceDetail detail) {
this.data = detail; this.data = detail;
initComponent(); initComponent();
this.setLayout(new FlowLayout(FlowLayout.LEFT)); this.setLayout(new FlowLayout(FlowLayout.LEFT));
this.setBorder(BorderFactory.createEmptyBorder(10,20,0,20)); this.setBorder(BorderFactory.createEmptyBorder(10, 20, 0, 20));
this.add(imagePane); this.add(imagePane);
this.add(contentPane); this.add(contentPane);
this.add(detailInfoPane); this.add(detailInfoPane);
this.setBackground(Color.WHITE); this.setBackground(Color.WHITE);
SwingUtilities.invokeLater(()->{scrollToTop();});
} }
public void refresh() { /**
* scrollPane创建后会拉到最底下初始化的时候手动拉到顶
*/
public void scrollToTop() {
infoScrollPane.getVerticalScrollBar().setValue(0);
detailInfoPane.getVerticalScrollBar().setValue(0);
} }
private void initComponent() { private void initComponent() {
createImagePane(); createImagePane();
createContentPane(); createContentPane();
createDetailInfoPane(); createDetailInfoScrollPane();
} }
private void createContentPane() { private void createContentPane() {
@ -97,6 +109,9 @@ public class TemplateResourceDetailPane extends JPanel {
contentPane.setBackground(Color.WHITE); contentPane.setBackground(Color.WHITE);
} }
/**
* 操作区查看详情立即使用
*/
private void createOperatePane() { private void createOperatePane() {
operatePane = new JPanel(new FlowLayout(FlowLayout.LEFT)); operatePane = new JPanel(new FlowLayout(FlowLayout.LEFT));
@ -118,6 +133,9 @@ public class TemplateResourceDetailPane extends JPanel {
} }
/**
* 查看详情
*/
JLabel createLinkLabel() { JLabel createLinkLabel() {
JLabel linkLabel = new JLabel(GOTO_DETAIL); JLabel linkLabel = new JLabel(GOTO_DETAIL);
linkLabel.setBackground(Color.WHITE); linkLabel.setBackground(Color.WHITE);
@ -132,11 +150,17 @@ public class TemplateResourceDetailPane extends JPanel {
return linkLabel; return linkLabel;
} }
// 方便埋点 /**
* 方便埋点
*/
void openResourceUrl(String url) { void openResourceUrl(String url) {
BrowseUtils.browser(url); BrowseUtils.browser(url);
} }
/**
* 立即使用 按钮
*/
JButton createStartUseButton() { JButton createStartUseButton() {
JButton starUseButton = new JButton(START_USE) { JButton starUseButton = new JButton(START_USE) {
@Override @Override
@ -148,7 +172,7 @@ public class TemplateResourceDetailPane extends JPanel {
super.paintComponent(g2d); super.paintComponent(g2d);
} }
}; };
starUseButton.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); starUseButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
starUseButton.setForeground(Color.WHITE); starUseButton.setForeground(Color.WHITE);
starUseButton.setFont(AlphaFineConstants.MEDIUM_FONT); starUseButton.setFont(AlphaFineConstants.MEDIUM_FONT);
starUseButton.addActionListener(new StartUseAction(data)); starUseButton.addActionListener(new StartUseAction(data));
@ -157,62 +181,48 @@ public class TemplateResourceDetailPane extends JPanel {
return starUseButton; return starUseButton;
} }
private void createImagePane() {
imagePane = new TemplateResourceImagePanel(data.getRoot(), IMAGE_WIDTH, IMAGE_HEIGHT);
}
/**
* 基本信息页
*/
private void createInfoScrollPane() { private void createInfoScrollPane() {
JLabel content = new JLabel();
content.setHorizontalAlignment(SwingConstants.LEFT);
content.setVerticalAlignment(SwingConstants.TOP);
StringBuilder sb = new StringBuilder();
sb.append("<html><body><p>");
sb.append(VENDOR + data.getVendor() + LF); StringBuilder sb = new StringBuilder();
List<String> tags = data.getTagsName(); // 开发者
sb.append(TAGS); sb.append(String.format(HTML_P_TAG_FORMAT, VENDOR + data.getVendor()));
for (String tag : tags) { // 标签
sb.append(tag + SPACE); sb.append(String.format(HTML_P_TAG_FORMAT, TAGS + data.getTagsString()));
// 所属模板包
if (!StringUtils.isEmpty(data.getParentPkgName())) {
sb.append(String.format(HTML_P_TAG_FORMAT, PARENT_PACKAGE + LinkStrUtils.generateLinkTagWithoutUnderLine(data.getParentPkgUrl(), data.getParentPkgName())));
} }
sb.append(LF); // 信息
sb.append(String.format(HTML_P_TAG_FORMAT, data.getInfo()));
sb.append(PARENT_PACKAGE + data.getParentPkgName() + LF);
sb.append(data.getInfo()); MessageWithLink content = new MessageWithLink(String.format(HTML_FORMAT, sb));
sb.append("</p></body></html>");
content.setText(sb.toString());
content.setBackground(INFO_PANE_BACKGROUND); content.setBackground(INFO_PANE_BACKGROUND);
content.setForeground(INFO_PANE_FOREGROUND); content.setForeground(INFO_PANE_FOREGROUND);
content.setPreferredSize(new Dimension(SCROLL_PANE_WIDTH - 10, TEXT_SCROLL_PANE_HEIGHT));
infoScrollPane = new UIScrollPane(content); infoScrollPane = new UIScrollPane(content);
infoScrollPane.setPreferredSize(new Dimension(SCROLL_PANE_WIDTH, SCROLL_PANE_HEIGHT)); infoScrollPane.setPreferredSize(new Dimension(SCROLL_PANE_WIDTH, SCROLL_PANE_HEIGHT));
infoScrollPane.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); infoScrollPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
}
private void createImagePane() {
imagePane = new TemplateResourceImagePanel(data.getRoot(), IMAGE_WIDTH, IMAGE_HEIGHT);
} }
private void createDetailInfoPane() { /**
* 详细信息页
JLabel content = new JLabel(); */
content.setHorizontalAlignment(SwingConstants.LEFT); private void createDetailInfoScrollPane() {
content.setVerticalAlignment(SwingConstants.TOP); MessageWithLink content = new MessageWithLink(String.format(DETAIL_INFO_HTML_FORMAT, data.getHtmlText()));
StringBuilder sb = new StringBuilder();
sb.append("<html><body><p>");
sb.append(DETAIL_INFO + LF);
List<String> detailInfos = data.getDetailInfo();
for (String info : detailInfos) {
sb.append(info);
}
sb.append("</p></body></html>");
content.setText(sb.toString());
content.setPreferredSize(new Dimension(PANE_WIDTH - 20, TEXT_SCROLL_PANE_HEIGHT));
content.setBackground(Color.WHITE);
detailInfoPane = new UIScrollPane(content); detailInfoPane = new UIScrollPane(content);
detailInfoPane.setPreferredSize(new Dimension(PANE_WIDTH, DETAIL_PANE_HEIGHT)); detailInfoPane.setPreferredSize(new Dimension(PANE_WIDTH, DETAIL_PANE_HEIGHT));
detailInfoPane.setBackground(Color.WHITE); detailInfoPane.setBackground(Color.WHITE);
detailInfoPane.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); detailInfoPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
} }
} }
Loading…
Cancel
Save