简介:本项目是一个基于Java语言开发的特定商店POS系统的积分管理模块,涉及顾客购物、积分计算与累积以及积分兑换等功能。项目包含完整的源代码和对应的毕业论文,详细阐述了系统的设计理念、实现方法、技术选型以及系统测试等方面内容。此外,系统可能包含两个关键模块或不同版本,即"FSPB1310"和"FSPB1400",其具体含义需要通过源代码和论文来进一步了解。该系统展现了Java编程基础、GUI设计、数据库操作、MVC模式的应用、积分管理设计、测试与调试技巧以及软件工程的实践。
Java是一种高级的、面向对象的编程语言,其特点在于跨平台性、安全性、面向对象特性以及庞大的社区支持。Java自1995年由Sun Microsystems公司推出后,经历了多个版本的迭代,每个新版本都增加了一些新的特性和改进。Java发展至今,已成为企业级应用、移动应用开发的主流语言之一。面向对象编程(OOP)是Java的核心,它通过封装、继承和多态等机制,使代码更加模块化,易于复用和维护。
Java的基础语法是编程的基石。包括数据类型(基本类型和引用类型)、变量声明、运算符的使用,以及控制流程语句(如if-else、for循环、while循环等)。掌握这些基础是进行更高级编程的前提。面向对象的编程原则,例如封装、继承和多态,是构建Java应用不可或缺的部分。
Java集合框架提供了高效的数据结构和算法来存储和操作数据。集合框架可以分为两大类:Collection和Map。Collection集合分为List、Set等接口,用于存储一组对象;而Map接口则用于存储键值对映射。Java集合框架不仅提供了丰富的接口和实现类,还支持集合的排序和比较,例如使用Comparable和Comparator接口。
import java.util.ArrayList;
import java.util.Collections;
***parator;
// 示例:使用ArrayList和Comparator进行排序
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 对字符串列表进行排序
Collections.sort(names);
// 使用自定义Comparator进行降序排序
Collections.sort(names, new Comparator<String>() {
public int compare(String s1, String s2) {
***pareTo(s1);
}
});
在Java中,所有这些集合类都可以在java.util包下找到。对Java集合框架的深入理解是进行复杂数据操作和设计高效Java应用的基础。
在当今的软件开发中,图形用户界面(GUI)已经成为提升用户体验的关键因素之一。它使得用户与计算机的交互更加直观、易于理解,而且美观。GUI设计涉及一系列设计原则、工具和方法,而Java,凭借其丰富的库支持,提供了一套成熟的工具集来创建和实现GUI。
用户体验是衡量软件好坏的重要指标。一个好的GUI设计可以极大提升用户操作的便捷性,减少操作错误,并增强用户的满意度。设计者需要从用户角度出发,考虑到用户的操作习惯、视觉认知和心理反应,使GUI既直观又美观。
Java提供了丰富的GUI组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)等。通过布局管理器,如BorderLayout、FlowLayout和GridLayout,这些组件可以被组织在窗口中。布局管理器帮助开发者在不同屏幕尺寸和分辨率下保持界面的一致性。
import javax.swing.*;
import java.awt.*;
public class SimpleGUI extends JFrame {
public SimpleGUI() {
setTitle("简单的GUI应用");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 添加组件
add(new JButton("点击我"), BorderLayout.NORTH);
add(new JTextField("文本框"), BorderLayout.CENTER);
add(new JLabel("标签"), BorderLayout.SOUTH);
// 调整大小并展示
pack();
setVisible(true);
}
public static void main(String[] args) {
new SimpleGUI();
}
}
在上述代码中,创建了一个简单的GUI应用,其中使用了 BorderLayout
布局管理器将三个组件分别放置到窗口的不同区域。
GUI程序需要能够响应用户的交互,如点击按钮、文本输入等。Java使用事件模式来处理这些交互。开发者需要为GUI组件添加事件,当特定事件发生时,会被触发执行相应的处理代码。
import javax.swing.*;
import java.awt.event.*;
public class EventHandlingExample {
public static void main(String[] args) {
JFrame frame = new JFrame("事件处理示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("点击我");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frame, "按钮被点击了!");
}
});
frame.getContentPane().add(button);
frame.pack();
frame.setVisible(true);
}
}
此代码创建了一个窗口,并在其中加入了一个按钮。当按钮被点击时,会弹出一个对话框,显示消息“按钮被点击了!”。这演示了如何使用事件来响应用户的点击事件。
GUI的设计和实现是一个复杂的过程,它需要设计者不断地学习和实践,以掌握最新的设计趋势和技术。随着技术的不断进步,还有更多的高级GUI框架和技术,如JavaFX,提供了更加强大和灵活的特性,帮助开发者创建更加丰富的用户界面。
Java Swing是一个用于开发Java应用程序用户界面的工具包。它包含了一整套图形用户界面组件,可用于创建丰富的桌面应用程序。
Swing不仅提供了基本的GUI组件,还允许开发者通过扩展和定制这些组件来实现更加复杂的功能。通过继承Swing组件类,开发者可以添加新的属性和方法,以满足特定的需求。
import javax.swing.*;
import java.awt.*;
public class CustomComponentExample extends JComponent {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("这是一个自定义的Swing组件", 10, 20);
}
public static void main(String[] args) {
JFrame frame = new JFrame("自定义组件示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.add(new CustomComponentExample());
frame.setVisible(true);
}
}
上述代码演示了如何创建一个简单的自定义Swing组件。通过重写 paintComponent
方法,该组件在渲染时会在指定位置绘制文本。
创建复合组件涉及到组合多个基本组件,并将它们放在一个自定义的布局中。通过实现特定的布局管理器,开发者可以更灵活地控制组件的位置和大小。
import javax.swing.*;
import java.awt.*;
public class MixedLayoutExample extends JFrame {
public MixedLayoutExample() {
setTitle("混合布局管理器示例");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(new JButton("按钮1"));
panel.add(new JButton("按钮2"));
panel.add(new JButton("按钮3"));
add(panel, BorderLayout.NORTH);
JTextArea textArea = new JTextArea(5, 20);
JScrollPane scrollPane = new JScrollPane(textArea);
add(scrollPane, BorderLayout.CENTER);
pack();
setVisible(true);
}
public static void main(String[] args) {
new MixedLayoutExample();
}
}
在这个例子中,使用了 BorderLayout
作为主要布局,并在北边区域使用 FlowLayout
来排列按钮。 JScrollPane
允许文本区域滚动,这在处理大量文本内容时非常有用。
Swing提供了丰富的窗口、对话框和菜单组件,使得开发者可以快速实现桌面应用程序的标准界面元素。 JFrame
是创建窗口的基类, JDialog
用于创建对话框,而 JMenuBar
和 JMenu
可用于添加菜单栏和菜单项。
import javax.swing.*;
public class MenusAndDialogsExample {
public static void main(String[] args) {
JFrame frame = new JFrame("菜单和对话框示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 添加菜单
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("菜单");
JMenuItem menuItem = new JMenuItem("菜单项");
menu.add(menuItem);
menuBar.add(menu);
frame.setJMenuBar(menuBar);
// 添加对话框
JOptionPane.showMessageDialog(frame, "这是一个对话框!");
frame.setVisible(true);
}
}
在上面的代码中,创建了一个窗口,并添加了菜单和菜单项。同时,展示了如何使用 JOptionPane
来创建简单的对话框。
Swing为开发者提供了强大的界面设计工具,其灵活的布局管理和丰富的组件集合使得实现复杂的桌面应用程序界面成为可能。随着JavaFX的出现,虽然Swing可能在某些方面略显老旧,但它仍然是目前使用最广泛的GUI库之一,尤其对于需要向后兼容的应用程序来说。通过不断学习和实践Swing的高级特性和最佳实践,开发者可以充分利用Java来创建功能强大且用户友好的应用程序。
JavaFX是一个用于构建富客户端应用程序的库,它是Java的官方图形和媒体包的一部分。JavaFX以其强大的图形能力和丰富的组件库而著称,用于替代旧的Swing/AWT技术集。
JavaFX相较于Swing有着更加现代化的API和更加强大的图形能力。它具有更加直观的场景图(Scene Graph)结构,支持CSS样式表来设计界面,使得界面设计更加灵活和一致。另外,JavaFX还拥有广泛的内置动画和媒体处理能力,这些都是Swing所不具备的。
场景图是JavaFX应用程序的基础结构,由一个根节点和多个子节点组成。每个节点在场景图中代表一个UI组件,如按钮或文本字段。JavaFX使用CSS样式表来定义节点的样式,这类似于在网页开发中使用CSS,允许开发者以声明式的方式设计界面。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class JavaFXCSSExample extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button("这是一个按钮");
btn.setStyle("-fx-background-color: blue; -fx-text-fill: white;");
StackPane root = new StackPane();
root.getChildren().add(btn);
root.setPrefSize(300, 250);
Scene scene = new Scene(root, 300, 250);
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
primaryStage.setTitle("JavaFX CSS样式定制");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
上述代码演示了如何在JavaFX应用程序中应用CSS样式。它创建了一个按钮,并直接在按钮上设置了样式。同时,还演示了如何使用外部样式表来定义界面样式。
JavaFX提供了非常强大的动画API,可以用来创建2D和3D动画效果。此外,JavaFX内置了对音频和视频文件的播放支持,这使得开发者可以轻松地为应用程序添加媒体元素。
import javafx.animation.*;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;
public class JavaFXAnimationExample extends Application {
@Override
public void start(Stage primaryStage) {
Rectangle rect = new Rectangle(0, 0, 100, 50);
rect.setFill(Color.BLUE);
// 创建动画
Timeline timeline = new Timeline(
new KeyFrame(Duration.seconds(0),
new KeyValue(rect.xProperty(), 0, Interpolator.EASE_BOTH)),
new KeyFrame(Duration.seconds(2),
new KeyValue(rect.xProperty(), 200, Interpolator.EASE_BOTH))
);
timeline.setCycleCount(10);
timeline.play();
StackPane root = new StackPane();
root.getChildren().add(rect);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("JavaFX 动画示例");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
上面的代码使用了 Timeline
和 KeyFrame
类创建了一个简单的动画,该动画使一个矩形沿水平方向来回移动。
JavaFX作为Java的现代图形平台,为开发者提供了更加丰富和高级的功能,使得开发复杂且吸引人的桌面应用程序成为可能。然而,JavaFX的引入并没有使Swing完全过时,因为它主要针对的是新开发的项目,而Swing仍然被广泛用于旧有系统的维护和更新。对任何有兴趣于开发图形界面应用程序的Java开发者来说,掌握Swing和JavaFX都是必不可少的技能。通过学习和运用这些工具,开发者可以构建出既强大又美观的应用程序界面,从而提供更加优质的用户体验。
关系型数据库是根据关系模型来组织数据的一种数据库,它以行(记录)和列(字段)的形式存储数据,利用标准的SQL语言进行查询和操作。关系型数据库的模型基于数学中的关系理论,因此得名。它强调数据的规范性,通常需要先定义数据结构(表结构),然后才可以存储数据。关系型数据库被广泛用于需要高效处理大量事务的场景,如金融服务、电子商务、库存管理等。
关系型数据库的核心特性包括:
SQL(Structured Query Language)是一种用于存储、检索和操作关系型数据库中数据的标准语言。SQL语言允许用户进行数据插入、查询、更新和删除等操作,还可以定义数据的结构、权限等。SQL语言结构简单且功能强大,大致可以分为以下几个部分:
在数据库操作中,SQL查询和数据修改是最常见的操作。下面是一些常用的SQL语句示例:
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column ASC|DESC
LIMIT number;
SELECT
:用于指定要检索的列。 FROM
:指定要查询的表。 WHERE
:用来过滤记录,设定查询条件。 ORDER BY
:根据某列对结果集进行排序。 LIMIT
:返回的结果集数量。 INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
INSERT INTO
:用于向表中插入新的数据行。 VALUES
:后跟括号内的值列表,必须与前面指定的列一一对应。 UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
UPDATE
:用于修改表中的数据。 SET
:指定要更新的列和新的值。 WHERE
:用于指定更新哪些行,如果没有WHERE子句,则更新所有行。 DELETE FROM table_name WHERE condition;
DELETE FROM
:用于删除表中的数据。 WHERE
:用于指定要删除哪些行。 以上为SQL语言基础操作的简介,实际应用中,SQL语句会更加复杂和灵活,可以进行多种条件的组合查询、批量操作以及子查询等高级操作。开发者需深入理解SQL语法并熟悉其最佳实践,以应对不同的数据处理场景。
MVC(Model-View-Controller)模式是一种广泛应用于软件工程的设计模式,它将应用程序的输入、处理和输出划分为三个相互关联但又的部分,以提升代码的可维护性和可扩展性。本章将详细介绍MVC设计模式的理论基础、实现机制和在实际项目中的应用。
MVC模式是一种分层架构模式,它通过分离数据层、表现层和控制层来简化复杂的系统,并使各个部分的职责更加明确。这种模式最早由Trygve Reenskaug在1978年提出,最初用于Smalltalk-80编程语言中,并在后来的计算机编程实践中得到了广泛的应用和发展。
核心思想是:Model(模型)负责数据的存储和业务逻辑处理;View(视图)负责数据的展示;Controller(控制器)负责接收用户的输入,并进行相应的处理,然后将处理结果通过Model反馈给View。
MVC模式与软件架构的关系紧密,它不仅仅是一种设计模式,也是一种架构模式,能够帮助开发人员在设计软件系统时,更好地遵循高内聚低耦合的设计原则。使用MVC模式,可以使得开发团队在并行开发不同模块的同时,减少了模块间的相互依赖,提高了系统的可维护性和可测试性。
在Java中,MVC模式得到了广泛的应用,从桌面应用程序到Web应用程序都可以使用MVC模式进行架构设计。例如,在Java Web开发中,可以使用Struts或Spring MVC等框架来实现MVC模式。这些框架提供了大量的工具和接口,帮助开发者更简洁地实现MVC模式中Model、View和Controller的职责划分。
下面通过一个简单的例子来说明MVC模式在Java Web中的应用:
// Model类
public class User {
private String name;
private int age;
// 省略构造函数、getter和setter方法
}
// Controller类
public class UserController {
private UserService userService = new UserServiceImpl();
public String addUser(String name, int age) {
User user = new User();
user.setName(name);
user.setAge(age);
userService.addUser(user);
return "success";
}
}
// View类
public class UserView {
public String getUserDetails(String name, int age) {
return "Name: " + name + ", Age: " + age;
}
}
// 假设存在UserService接口和实现类UserServiceImpl用于处理业务逻辑
在上述代码中, User
类代表模型层,负责数据的存储; UserController
类代表控制层,负责接收和处理用户的请求,并将结果传递给视图层; UserView
类代表视图层,负责数据的展示。
在MVC模式中,Model、View和Controller各自承担着不同的职责:
Model层是应用程序的核心部分,它表示了数据和业务逻辑。在Java中,Model通常由JavaBean或POJO(普通旧Java对象)类来实现。Model层主要负责与数据库等数据存储进行交互,并将数据封装成对象供其它层使用。
View层是用户界面,它用于显示数据(Model),并向用户展示信息。在Web应用程序中,View通常是JSP、HTML页面等。
Controller层是应用程序的协调者,它接收来自用户的输入,并将请求转发给Model进行处理。处理完成后,Controller决定将结果发送到哪个View显示。
MVC模式中的Controller是事件驱动的中心。当用户与View进行交互时(例如点击按钮),View会向Controller发送事件,Controller根据事件类型和内容决定如何处理,处理结果是调用Model的数据处理方法或更新View层的显示。
在MVC模式中,数据流和控制流遵循以下路径:
在实际的企业级应用开发中,根据不同的需求和目标平台,开发者会选择不同的MVC框架进行开发。例如,Spring MVC是基于Java的企业级Web应用MVC框架,它利用Spring框架的依赖注入和面向切面编程特性,为Web层提供了丰富的功能。
配置Spring MVC通常涉及以下步骤:
在大型项目中,MVC模式有助于代码的组织和模块划分,使项目结构更加清晰。通常,开发者会按照以下方式进行模块划分:
src/main/java
目录下的 model
包中。 controller
包中。 src/main/webapp
目录下的对应视图文件夹中,例如 WEB-INF/views
。 代码的模块化有助于团队协作和后续的维护工作。
在实际应用中,为了提升性能,MVC模式需要适当的优化策略,例如:
在Web应用中,还可以通过负载均衡、Web服务器优化等方式,进一步提升整个MVC架构的性能。
在积分管理系统的设计之初,首要任务是对商业逻辑进行细致的分析,以确立需求规范。积分系统通常应用于零售、金融、服务行业,用于激励用户消费行为、增强客户忠诚度。典型的积分管理系统的商业逻辑包括积分的获取、积分的累计、积分的兑换以及积分的有效期管理等。在此基础上,需求规范可以细化为以下几个方面:
积分管理系统功能模块划分需确保系统灵活、可扩展,同时兼顾维护的简便性。一般情况下,可以将系统划分为以下几个模块:
用户交互流程设计要确保用户操作简便直观。流程设计需要考虑到用户在系统中的各种操作路径,并在设计上保持一致性,提高用户体验。典型的用户交互流程设计包括:
积分管理系统的架构设计采用经典的MVC模式,可以清晰地分离视图(View)、控制器(Controller)、模型(Model)三个主要组件。组件划分如下:
数据库结构设计直接关系到系统的性能和扩展性。积分管理系统通常需要以下几个关键的数据库表:
数据库优化可以从多个维度进行,如建立合适的索引、合理设计查询语句、使用数据库缓存机制等,以确保系统的高效运行。
考虑到积分管理系统涉及用户的敏感信息,安全性是不可忽视的方面。系统应采用安全的通信协议,如HTTPS,同时对敏感数据进行加密存储。此外,对于系统的性能,需要着重考虑以下几点:
积分管理系统的用户界面应美观、直观、操作便捷。GUI的实现可以采用Java Swing或JavaFX框架。Swing是Java早期的GUI开发包,而JavaFX提供更丰富的图形效果和动画支持,界面更加现代化。
以Swing为例,GUI的构建过程可以分为以下几个步骤:
积分计算的准确性和即时性是系统的核心。在实现积分计算时,需要考虑到各种业务规则。规则引擎可以被用来管理和维护这些复杂的业务逻辑。一个规则引擎如Drools,可以让你定义业务规则并以声明式的方式执行它们,从而使得业务逻辑的变更和维护变得简单。
例如,可以定义一条规则:
规则: "积分累计规则"
条件: 订单金额 >= 1000
动作: 用户积分增加 = 订单金额 * 0.1
系统部署和维护策略需要确保系统上线后的稳定性和可持续发展。部署策略可以基于容器化,如使用Docker镜像。维护策略则包括定期更新系统、监控系统健康状况、及时处理突发事件等。
例如,对于一个基于Spring Boot的积分管理系统,可以通过构建一个Docker镜像来打包应用,然后在任何支持Docker的环境中运行。对于监控,可以集成Prometheus和Grafana来监控应用的性能指标。
代码示例:
# Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=***","-jar","/app.jar"]
通过以上内容,完成了积分管理系统设计的全面介绍,涵盖了从需求分析到系统实现的每一个关键步骤,为实现一个稳定、高效、用户友好的积分管理系统提供了理论和技术基础。
软件测试是确保软件质量和可靠性的关键环节,其主要目的是发现程序中的错误和缺陷,验证软件的功能是否符合预期。测试策略涉及测试的范围、方法、计划和工具的选择。
软件测试的目的主要是确保产品的质量符合客户需求,发现软件中的缺陷和问题,以及评估软件的性能和安全性。测试类型按照不同的维度可以有不同的分类,例如:
测试用例是指导测试执行的详细步骤、输入数据和预期结果。设计有效的测试用例是提高测试效率和效果的关键。测试计划则是一份文档,描述了测试的策略、方法、资源、进度和风险管理等内容。
测试用例的设计应遵循以下原则:
测试计划的制定则需要考虑以下因素:
随着软件开发迭代的加快,自动化测试成为提高测试效率、保证测试覆盖率的有效手段。选用合适的自动化测试工具有助于简化测试流程,提高测试的精确性和效率。
一些常见的自动化测试工具包括:
自动化测试工具的选用应基于以下考虑:
在实际应用中,自动化测试并不是万能的,它通常与手动测试相结合,发挥各自的优势。
调试是一个复杂且需要技巧的过程,它涉及发现、定位和修复软件中的缺陷。
调试过程的常见问题包括:
解决这些问题的方法包括:
日志分析是调试的重要手段。通过分析日志文件,可以快速定位问题发生的时机和可能的范围。异常处理机制,如try-catch语句,在Java中用于捕获和处理程序运行时可能出现的异常情况。
异常处理时应当注意:
性能问题通常表现为系统运行缓慢或响应时间过长。性能分析和瓶颈诊断是找到性能问题根源的有效方法。
常见的性能分析工具包括:
性能分析和瓶颈诊断通常包括以下步骤:
集成测试和系统测试是软件开发过程中的关键测试阶段,它们分别关注模块间的协作和整个系统的运行。
这两个阶段的测试流程包括:
测试覆盖率是衡量测试全面性的指标之一,通常使用百分比来表示,它反映了测试执行过程中程序代码的覆盖程度。质量保证(QA)是确保产品符合客户和用户需求的过程。
提高测试覆盖率的方法包括:
软件部署是将软件从开发环境转移到生产环境的过程。版本控制管理是软件开发生命周期中对软件版本进行有效控制和管理的实践。
软件部署应该遵循以下步骤:
版本控制管理则需要关注:
通过以上细致的步骤,可以确保软件在部署到生产环境后能够稳定运行,并且便于未来的维护和升级。
简介:本项目是一个基于Java语言开发的特定商店POS系统的积分管理模块,涉及顾客购物、积分计算与累积以及积分兑换等功能。项目包含完整的源代码和对应的毕业论文,详细阐述了系统的设计理念、实现方法、技术选型以及系统测试等方面内容。此外,系统可能包含两个关键模块或不同版本,即"FSPB1310"和"FSPB1400",其具体含义需要通过源代码和论文来进一步了解。该系统展现了Java编程基础、GUI设计、数据库操作、MVC模式的应用、积分管理设计、测试与调试技巧以及软件工程的实践。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuoyibo.net 版权所有 湘ICP备2023021910号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务