diff --git a/.vscode/settings.json b/.vscode/settings.json index c5f3f6b..0153b31 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "java.configuration.updateBuildConfiguration": "interactive" + "java.configuration.updateBuildConfiguration": "interactive", + "java.compile.nullAnalysis.mode": "disabled" } \ No newline at end of file diff --git a/src/main/java/ru/ulstu/fc/config/SecurityConfiguration.java b/src/main/java/ru/ulstu/fc/config/SecurityConfiguration.java index 18900be..be6b4ea 100644 --- a/src/main/java/ru/ulstu/fc/config/SecurityConfiguration.java +++ b/src/main/java/ru/ulstu/fc/config/SecurityConfiguration.java @@ -4,7 +4,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; diff --git a/src/main/java/ru/ulstu/fc/core/model/BaseEntity.java b/src/main/java/ru/ulstu/fc/core/model/BaseEntity.java index bcc4c00..265bc4f 100644 --- a/src/main/java/ru/ulstu/fc/core/model/BaseEntity.java +++ b/src/main/java/ru/ulstu/fc/core/model/BaseEntity.java @@ -12,7 +12,7 @@ import java.io.Serializable; @MappedSuperclass public abstract class BaseEntity implements Serializable, Comparable { @Id - @GeneratedValue(strategy = GenerationType.TABLE) + @GeneratedValue(strategy = GenerationType.SEQUENCE) private Integer id; @Version diff --git a/src/main/java/ru/ulstu/fc/project/controller/ProjectController.java b/src/main/java/ru/ulstu/fc/project/controller/ProjectController.java index a835938..e248e4b 100644 --- a/src/main/java/ru/ulstu/fc/project/controller/ProjectController.java +++ b/src/main/java/ru/ulstu/fc/project/controller/ProjectController.java @@ -12,6 +12,7 @@ import ru.ulstu.fc.project.model.Project; import ru.ulstu.fc.project.model.ProjectForm; import ru.ulstu.fc.project.service.ProjectRulesService; import ru.ulstu.fc.project.service.ProjectService; +import ru.ulstu.fc.project.service.ProjectVariableService; import ru.ulstu.fc.user.model.UserRoleConstants; @Controller @@ -21,11 +22,14 @@ import ru.ulstu.fc.user.model.UserRoleConstants; public class ProjectController { private final ProjectService projectService; private final ProjectRulesService projectRulesService; + private final ProjectVariableService projectVariableService; public ProjectController(ProjectService projectService, - ProjectRulesService projectRulesService) { + ProjectRulesService projectRulesService, + ProjectVariableService projectVariableService) { this.projectService = projectService; this.projectRulesService = projectRulesService; + this.projectVariableService = projectVariableService; } @GetMapping("list") @@ -42,6 +46,7 @@ public class ProjectController { : new Project())); model.addAttribute("rules", projectRulesService.getByProjectId(id)); + model.addAttribute("variables", projectVariableService.getByProjectId(id)); return "project/edit"; } diff --git a/src/main/java/ru/ulstu/fc/project/model/Project.java b/src/main/java/ru/ulstu/fc/project/model/Project.java index 4725550..f071540 100644 --- a/src/main/java/ru/ulstu/fc/project/model/Project.java +++ b/src/main/java/ru/ulstu/fc/project/model/Project.java @@ -1,19 +1,20 @@ package ru.ulstu.fc.project.model; +import java.util.Date; + +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotEmpty; import ru.ulstu.fc.core.model.BaseEntity; import ru.ulstu.fc.user.model.User; -import java.util.Date; - @Entity public class Project extends BaseEntity { @NotEmpty(message = "Текст новости не может быть пустым") private String name; private Date createDate = new Date(); - @ManyToOne + @ManyToOne(cascade = CascadeType.MERGE) private User user; public Project() { diff --git a/src/main/java/ru/ulstu/fc/project/repository/RuleRepository.java b/src/main/java/ru/ulstu/fc/project/repository/RuleRepository.java deleted file mode 100644 index 6369ff5..0000000 --- a/src/main/java/ru/ulstu/fc/project/repository/RuleRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.ulstu.fc.project.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; - -import ru.ulstu.fc.rule.model.Rule; - -public interface RuleRepository extends JpaRepository { - - List findByProjectId(Integer projectId); -} diff --git a/src/main/java/ru/ulstu/fc/project/service/ProjectRulesService.java b/src/main/java/ru/ulstu/fc/project/service/ProjectRulesService.java index 5d00690..88fe5d1 100644 --- a/src/main/java/ru/ulstu/fc/project/service/ProjectRulesService.java +++ b/src/main/java/ru/ulstu/fc/project/service/ProjectRulesService.java @@ -1,21 +1,28 @@ package ru.ulstu.fc.project.service; +import java.util.Collections; import java.util.List; import org.springframework.stereotype.Service; -import ru.ulstu.fc.project.repository.RuleRepository; -import ru.ulstu.fc.rule.model.Rule; +import ru.ulstu.fc.rule.repository.FuzzyRuleRepository; +import ru.ulstu.fc.rule.model.FuzzyRule; @Service public class ProjectRulesService { - private final RuleRepository ruleRepository; + private final FuzzyRuleRepository ruleRepository; + private final ProjectService projectService; - public ProjectRulesService(RuleRepository ruleRepository) { + public ProjectRulesService(FuzzyRuleRepository ruleRepository, + ProjectService projectService) { this.ruleRepository = ruleRepository; + this.projectService = projectService; } - public List getByProjectId(Integer projectId) { - return ruleRepository.findByProjectId(projectId); + public List getByProjectId(Integer projectId) { + if (projectId == null || projectId == 0) { + return Collections.emptyList(); + } + return ruleRepository.findByProject(projectService.getById(projectId)); } } diff --git a/src/main/java/ru/ulstu/fc/project/service/ProjectVariableService.java b/src/main/java/ru/ulstu/fc/project/service/ProjectVariableService.java new file mode 100644 index 0000000..e05031a --- /dev/null +++ b/src/main/java/ru/ulstu/fc/project/service/ProjectVariableService.java @@ -0,0 +1,28 @@ +package ru.ulstu.fc.project.service; + +import java.util.Collections; +import java.util.List; + +import org.springframework.stereotype.Service; + +import ru.ulstu.fc.rule.repository.VariableRepository; +import ru.ulstu.fc.rule.model.Variable; + +@Service +public class ProjectVariableService { + private final VariableRepository variableRepository; + private final ProjectService projectService; + + public ProjectVariableService(VariableRepository variableRepository, + ProjectService projectService) { + this.variableRepository = variableRepository; + this.projectService = projectService; + } + + public List getByProjectId(Integer projectId) { + if (projectId == null || projectId == 0) { + return Collections.emptyList(); + } + return variableRepository.findByProject(projectService.getById(projectId)); + } +} diff --git a/src/main/java/ru/ulstu/fc/rule/controller/InferenceMvcController.java b/src/main/java/ru/ulstu/fc/rule/controller/InferenceMvcController.java index ebd0f13..07fe4dd 100644 --- a/src/main/java/ru/ulstu/fc/rule/controller/InferenceMvcController.java +++ b/src/main/java/ru/ulstu/fc/rule/controller/InferenceMvcController.java @@ -7,10 +7,9 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import ru.ulstu.fc.rule.model.Antecedent; import ru.ulstu.fc.rule.model.InferenceForm; +import ru.ulstu.fc.rule.model.FuzzyTerm; import ru.ulstu.fc.rule.model.Variable; -import ru.ulstu.fc.rule.model.VariableValue; import ru.ulstu.fc.rule.service.FuzzyInferenceService; import java.util.Arrays; @@ -45,21 +44,21 @@ public class InferenceMvcController { return "index"; } - private List getAgeValues() { + private List getAgeValues() { Variable var = new Variable("Age"); - var.getValues().addAll(Arrays.asList( - new VariableValue("молодой", 30.0), - new VariableValue("средний", 45.0), - new VariableValue("старый", 60.0))); - return var.getValues(); + var.getFuzzyTerms().addAll(Arrays.asList( + new FuzzyTerm("молодой", 30.0), + new FuzzyTerm("средний", 45.0), + new FuzzyTerm("старый", 60.0))); + return var.getFuzzyTerms(); } - private List getIncomeValues() { + private List getIncomeValues() { Variable var = new Variable("Income"); - var.getValues().addAll(Arrays.asList( - new VariableValue("небольшой", 20000.0), - new VariableValue("средний", 90000.0), - new VariableValue("высокий", 200000.0))); - return var.getValues(); + var.getFuzzyTerms().addAll(Arrays.asList( + new FuzzyTerm("небольшой", 20000.0), + new FuzzyTerm("средний", 90000.0), + new FuzzyTerm("высокий", 200000.0))); + return var.getFuzzyTerms(); } } diff --git a/src/main/java/ru/ulstu/fc/rule/controller/RuleController.java b/src/main/java/ru/ulstu/fc/rule/controller/RuleController.java index 6107baa..284aa06 100644 --- a/src/main/java/ru/ulstu/fc/rule/controller/RuleController.java +++ b/src/main/java/ru/ulstu/fc/rule/controller/RuleController.java @@ -2,21 +2,22 @@ package ru.ulstu.fc.rule.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -import ru.ulstu.fc.rule.model.Rule; -import ru.ulstu.fc.rule.model.RuleForm; -import ru.ulstu.fc.rule.service.RuleService; +import jakarta.validation.Valid; +import ru.ulstu.fc.rule.model.FuzzyRuleForm; +import ru.ulstu.fc.rule.service.FuzzyRuleService; @Controller @RequestMapping("rule") public class RuleController { - private final RuleService ruleService; + private final FuzzyRuleService ruleService; - public RuleController(RuleService ruleService) { + public RuleController(FuzzyRuleService ruleService) { this.ruleService = ruleService; } @@ -24,25 +25,28 @@ public class RuleController { public String edit(@PathVariable(value = "projectId") Integer projectId, @PathVariable(value = "ruleId") Integer id, Model model) { model.addAttribute("projectId", projectId); - model.addAttribute("rule", - new RuleForm((id != null && id != 0) - ? ruleService.getById(id) - : new Rule())); - + model.addAttribute("fuzzyRuleForm", + (id != null && id != 0) + ? new FuzzyRuleForm(id, ruleService.getById(id)) + : new FuzzyRuleForm(id, projectId)); return "rule/edit"; } @PostMapping(value = "save", params = "save") - public String save(RuleForm ruleForm, Model model) { - model.addAttribute("rule", ruleService.save(ruleForm)); - return "redirect:/project/edit/" + ruleForm.getProjectId(); + public String save(@Valid FuzzyRuleForm fuzzyRuleForm, BindingResult bindingResult, Model model) { + if (bindingResult.hasErrors()) { + model.addAttribute("projectId", fuzzyRuleForm.getProjectId()); + return "rule/edit"; + } + ruleService.save(fuzzyRuleForm); + return "redirect:/project/edit/" + fuzzyRuleForm.getProjectId(); } @PostMapping(value = "save", params = "delete") - public String delete(RuleForm ruleForm) { - if (ruleForm != null && ruleForm.getId() != null) { - ruleService.delete(ruleForm); + public String delete(FuzzyRuleForm fuzzyRuleForm) { + if (fuzzyRuleForm != null && fuzzyRuleForm.getId() != null) { + ruleService.delete(fuzzyRuleForm); } - return "redirect:/project/edit/" + ruleForm.getProjectId(); + return "redirect:/project/edit/" + fuzzyRuleForm.getProjectId(); } } diff --git a/src/main/java/ru/ulstu/fc/rule/controller/VariableController.java b/src/main/java/ru/ulstu/fc/rule/controller/VariableController.java new file mode 100644 index 0000000..565dbff --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/controller/VariableController.java @@ -0,0 +1,52 @@ +package ru.ulstu.fc.rule.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import jakarta.validation.Valid; +import ru.ulstu.fc.rule.model.VariableForm; +import ru.ulstu.fc.rule.service.VariableService; + +@Controller +@RequestMapping("var") +public class VariableController { + private final VariableService variableService; + + public VariableController(VariableService variableService) { + this.variableService = variableService; + } + + @GetMapping("/edit/{projectId}/{varId}") + public String edit(@PathVariable(value = "projectId") Integer projectId, + @PathVariable(value = "varId") Integer id, Model model) { + model.addAttribute("projectId", projectId); + model.addAttribute("variableForm", + (id != null && id != 0) + ? new VariableForm(id, variableService.getById(id)) + : new VariableForm(id, projectId)); + return "var/edit"; + } + + @PostMapping(value = "save", params = "save") + public String save(@Valid VariableForm variableForm, BindingResult result, Model model) { + if (result.hasErrors()) { + model.addAttribute("projectId", variableForm.getProjectId()); + return "var/edit"; + } + variableService.save(variableForm); + return "redirect:/project/edit/" + variableForm.getProjectId(); + } + + @PostMapping(value = "save", params = "delete") + public String delete(VariableForm variableForm) { + if (variableForm != null && variableForm.getId() != null) { + variableService.delete(variableForm); + } + return "redirect:/project/edit/" + variableForm.getProjectId(); + } +} diff --git a/src/main/java/ru/ulstu/fc/rule/model/Antecedent.java b/src/main/java/ru/ulstu/fc/rule/model/Antecedent.java deleted file mode 100644 index 7df29b5..0000000 --- a/src/main/java/ru/ulstu/fc/rule/model/Antecedent.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.ulstu.fc.rule.model; - -import jakarta.persistence.Entity; -import jakarta.persistence.ManyToOne; -import ru.ulstu.fc.core.model.BaseEntity; - -@Entity -public class Antecedent extends BaseEntity { - @ManyToOne - private Variable variable; - private String value; - - public Variable getVariable() { - return variable; - } - public void setVariable(Variable variable) { - this.variable = variable; - } - public String getValue() { - return value; - } - public void setValue(String value) { - this.value = value; - } -} diff --git a/src/main/java/ru/ulstu/fc/rule/model/Consequent.java b/src/main/java/ru/ulstu/fc/rule/model/Consequent.java deleted file mode 100644 index ae4148c..0000000 --- a/src/main/java/ru/ulstu/fc/rule/model/Consequent.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.ulstu.fc.rule.model; - -import jakarta.persistence.Entity; -import jakarta.persistence.ManyToOne; -import ru.ulstu.fc.core.model.BaseEntity; - -@Entity -public class Consequent extends BaseEntity { - @ManyToOne - private Variable variable; - private String value; - - public Variable getVariable() { - return variable; - } - - public void setVariable(Variable variable) { - this.variable = variable; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - -} diff --git a/src/main/java/ru/ulstu/fc/rule/model/FuzzyRule.java b/src/main/java/ru/ulstu/fc/rule/model/FuzzyRule.java new file mode 100644 index 0000000..04b07ec --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/model/FuzzyRule.java @@ -0,0 +1,36 @@ +package ru.ulstu.fc.rule.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import ru.ulstu.fc.core.model.BaseEntity; +import ru.ulstu.fc.project.model.Project; + +@Entity +public class FuzzyRule extends BaseEntity { + @ManyToOne + @NotNull + private Project project; + @Size(min = 5, max = 250, message = "Длина от 5 до 250 символов") + private String content; + + public FuzzyRule() { + } + + public Project getProject() { + return project; + } + + public void setProject(Project project) { + this.project = project; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/src/main/java/ru/ulstu/fc/rule/model/FuzzyRuleForm.java b/src/main/java/ru/ulstu/fc/rule/model/FuzzyRuleForm.java new file mode 100644 index 0000000..5ae6d32 --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/model/FuzzyRuleForm.java @@ -0,0 +1,52 @@ +package ru.ulstu.fc.rule.model; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +public class FuzzyRuleForm { + private Integer id; + @NotNull + private Integer projectId; + + @Size(min = 5, max = 250, message = "Длина от 5 до 250 символов") + private String content; + + public FuzzyRuleForm() { + } + + public FuzzyRuleForm(Integer id, Integer projectId) { + this.id = id; + this.projectId = projectId; + } + + public FuzzyRuleForm(Integer id, FuzzyRule fuzzyRule) { + this.id = fuzzyRule.getId(); + this.projectId = fuzzyRule.getProject().getId(); + this.content = fuzzyRule.getContent(); + } + + public Integer getProjectId() { + return projectId; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + +} diff --git a/src/main/java/ru/ulstu/fc/rule/model/FuzzyTerm.java b/src/main/java/ru/ulstu/fc/rule/model/FuzzyTerm.java new file mode 100644 index 0000000..19c4308 --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/model/FuzzyTerm.java @@ -0,0 +1,34 @@ +package ru.ulstu.fc.rule.model; + +import jakarta.persistence.Entity; +import ru.ulstu.fc.core.model.BaseEntity; + +@Entity +public class FuzzyTerm extends BaseEntity { + private String description; + private Double crispValue; + + public FuzzyTerm() { + } + + public FuzzyTerm(String description, Double value) { + this.description = description; + this.crispValue = value; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Double getCrispValue() { + return crispValue; + } + + public void setCrispValue(Double crispValue) { + this.crispValue = crispValue; + } +} diff --git a/src/main/java/ru/ulstu/fc/rule/model/Rule.java b/src/main/java/ru/ulstu/fc/rule/model/Rule.java deleted file mode 100644 index cb071cb..0000000 --- a/src/main/java/ru/ulstu/fc/rule/model/Rule.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.ulstu.fc.rule.model; - -import java.util.List; - -import jakarta.persistence.Entity; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import ru.ulstu.fc.core.model.BaseEntity; -import ru.ulstu.fc.project.model.Project; - -@Entity -public class Rule extends BaseEntity { - @ManyToOne - private Project project; - @OneToMany - private List antecedents; //TODO: AND / OR? - @ManyToOne - private Consequent consequent; - - public Rule() { - } - - public Project getProject() { - return project; - } - - public void setProject(Project project) { - this.project = project; - } - - public List getAntecedents() { - return antecedents; - } - - public void setAntecedents(List antecedents) { - this.antecedents = antecedents; - } - - public Consequent getConsequent() { - return consequent; - } - - public void setConsequent(Consequent consequent) { - this.consequent = consequent; - } - -} diff --git a/src/main/java/ru/ulstu/fc/rule/model/RuleForm.java b/src/main/java/ru/ulstu/fc/rule/model/RuleForm.java deleted file mode 100644 index e9d8629..0000000 --- a/src/main/java/ru/ulstu/fc/rule/model/RuleForm.java +++ /dev/null @@ -1,32 +0,0 @@ -package ru.ulstu.fc.rule.model; - -public class RuleForm { - private Integer id; - private Integer projectId; - - public RuleForm() { - } - - public RuleForm(Rule rule) { - this.projectId = (rule == null || rule.getProject() == null) - ? null - : rule.getProject().getId(); - } - - public Integer getProjectId() { - return projectId; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public void setProjectId(Integer projectId) { - this.projectId = projectId; - } - -} diff --git a/src/main/java/ru/ulstu/fc/rule/model/Variable.java b/src/main/java/ru/ulstu/fc/rule/model/Variable.java index 57c07a6..9343d64 100644 --- a/src/main/java/ru/ulstu/fc/rule/model/Variable.java +++ b/src/main/java/ru/ulstu/fc/rule/model/Variable.java @@ -3,33 +3,73 @@ package ru.ulstu.fc.rule.model; import java.util.ArrayList; import java.util.List; +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import ru.ulstu.fc.core.model.BaseEntity; +import ru.ulstu.fc.project.model.Project; @Entity public class Variable extends BaseEntity { + @Size(min = 3, max = 250, message = "Длина должна быть от 3 до 250") private String name; - @OneToMany - private List values = new ArrayList<>(); + + @ManyToOne + @NotNull + private Project project; + + private boolean input = true; + + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) + @JoinColumn(name = "variable_id", unique = true) + private List fuzzyTerms = new ArrayList<>(); public Variable() { } - public Variable(String name, List values) { - this.name = name; - this.values = values; - } - public Variable(String name) { this.name = name; } + public Variable(String name, List fuzzyTerms) { + this.name = name; + this.fuzzyTerms = fuzzyTerms; + } + public String getName() { return name; } - public List getValues() { - return values; + public void setName(String name) { + this.name = name; + } + + public List getFuzzyTerms() { + return fuzzyTerms; + } + + public void setFuzzyTerms(List fuzzyTerms) { + this.fuzzyTerms = fuzzyTerms; + } + + public Project getProject() { + return project; + } + + public void setProject(Project project) { + this.project = project; + } + + public boolean isInput() { + return input; + } + + public void setInput(boolean input) { + this.input = input; } } diff --git a/src/main/java/ru/ulstu/fc/rule/model/VariableForm.java b/src/main/java/ru/ulstu/fc/rule/model/VariableForm.java new file mode 100644 index 0000000..752c75c --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/model/VariableForm.java @@ -0,0 +1,61 @@ +package ru.ulstu.fc.rule.model; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +public class VariableForm { + private Integer id; + @NotNull + private Integer projectId; + @Size(min = 3, max = 250, message = "Длина должна быть от 3 до 250") + private String name; + + private boolean input = true; + + public VariableForm() { + } + + public VariableForm(Integer id, Integer projectId) { + this.id = id; + this.projectId = projectId; + } + + public VariableForm(Integer id, Variable variable) { + this.id = id; + this.projectId = variable.getProject().getId(); + this.name = variable.getName(); + this.input = variable.isInput(); + } + + public Integer getProjectId() { + return projectId; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isInput() { + return input; + } + + public void setInput(boolean input) { + this.input = input; + } +} diff --git a/src/main/java/ru/ulstu/fc/rule/model/VariableValue.java b/src/main/java/ru/ulstu/fc/rule/model/VariableValue.java deleted file mode 100644 index e3d4fe4..0000000 --- a/src/main/java/ru/ulstu/fc/rule/model/VariableValue.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.ulstu.fc.rule.model; - -import jakarta.persistence.Entity; -import ru.ulstu.fc.core.model.BaseEntity; - -@Entity -public class VariableValue extends BaseEntity { - private String fuzzyTerm; - private Double value; - - public VariableValue() { - } - - public VariableValue(String fuzzyTerm, Double value) { - this.fuzzyTerm = fuzzyTerm; - this.value = value; - } - - public String getFuzzyTerm() { - return fuzzyTerm; - } - - public void setFuzzyTerm(String fuzzyTerm) { - this.fuzzyTerm = fuzzyTerm; - } - - public Double getValue() { - return value; - } - - public void setValue(Double value) { - this.value = value; - } -} diff --git a/src/main/java/ru/ulstu/fc/rule/repository/FuzzyRuleRepository.java b/src/main/java/ru/ulstu/fc/rule/repository/FuzzyRuleRepository.java new file mode 100644 index 0000000..ed36909 --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/repository/FuzzyRuleRepository.java @@ -0,0 +1,13 @@ +package ru.ulstu.fc.rule.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import ru.ulstu.fc.project.model.Project; +import ru.ulstu.fc.rule.model.FuzzyRule; + +public interface FuzzyRuleRepository extends JpaRepository { + + List findByProject(Project project); +} diff --git a/src/main/java/ru/ulstu/fc/rule/repository/VariableRepository.java b/src/main/java/ru/ulstu/fc/rule/repository/VariableRepository.java new file mode 100644 index 0000000..f0d4cdc --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/repository/VariableRepository.java @@ -0,0 +1,13 @@ +package ru.ulstu.fc.rule.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import ru.ulstu.fc.project.model.Project; +import ru.ulstu.fc.rule.model.Variable; + +public interface VariableRepository extends JpaRepository { + + List findByProject(Project project); +} diff --git a/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java b/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java index 5f1b72c..7aded59 100644 --- a/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java +++ b/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java @@ -15,8 +15,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.ulstu.fc.rule.model.OutputValue; +import ru.ulstu.fc.rule.model.FuzzyTerm; import ru.ulstu.fc.rule.model.Variable; -import ru.ulstu.fc.rule.model.VariableValue; import java.util.List; import java.util.Map; @@ -45,15 +45,15 @@ public class FuzzyInferenceService { final InputVariable input = new InputVariable(); input.setName(variable.getName()); input.setDescription(""); - input.setRange(0, variable.getValues().get(variable.getValues().size() - 1).getValue()); + input.setRange(0, variable.getFuzzyTerms().get(variable.getFuzzyTerms().size() - 1).getCrispValue()); input.setEnabled(true); input.setLockValueInRange(false); double prev = 0; - for (int i = 0; i < variable.getValues().size(); i++) { - Triangle term = new Triangle(variable.getValues().get(i).getFuzzyTerm(), + for (int i = 0; i < variable.getFuzzyTerms().size(); i++) { + Triangle term = new Triangle(variable.getFuzzyTerms().get(i).getDescription(), prev, - variable.getValues().get(i).getValue(), - variable.getValues().get(i).getValue() + variable.getValues().get(i).getValue() - prev); + variable.getFuzzyTerms().get(i).getCrispValue(), + variable.getFuzzyTerms().get(i).getCrispValue() + variable.getFuzzyTerms().get(i).getCrispValue() - prev); prev = term.getVertexB(); input.addTerm(term); } @@ -64,19 +64,19 @@ public class FuzzyInferenceService { final OutputVariable output = new OutputVariable(); output.setName(variable.getName()); output.setDescription(""); - output.setRange(0, variable.getValues().get(variable.getValues().size() - 1).getValue()); + output.setRange(0, variable.getFuzzyTerms().get(variable.getFuzzyTerms().size() - 1).getCrispValue()); output.setEnabled(true); output.setAggregation(new Maximum()); output.setDefuzzifier(new WeightedAverage()); output.setDefaultValue(Double.NaN); output.setLockValueInRange(false); double prev = 0; - for (int i = 0; i < variable.getValues().size(); i++) { + for (int i = 0; i < variable.getFuzzyTerms().size(); i++) { Triangle term = new Triangle( - variable.getValues().get(i).getFuzzyTerm(), + variable.getFuzzyTerms().get(i).getDescription(), prev, - variable.getValues().get(i).getValue(), - variable.getValues().get(i).getValue() + variable.getValues().get(i).getValue() - prev); + variable.getFuzzyTerms().get(i).getCrispValue(), + variable.getFuzzyTerms().get(i).getCrispValue() + variable.getFuzzyTerms().get(i).getCrispValue() - prev); prev = term.getVertexB(); output.addTerm(term); } @@ -98,6 +98,7 @@ public class FuzzyInferenceService { mamdani.setImplication(new AlgebraicProduct()); mamdani.setActivation(new General()); rules.forEach(r -> mamdani.addRule(Rule.parse(r, engine))); + mamdani.addRule(new Rule()); return mamdani; } @@ -130,20 +131,20 @@ public class FuzzyInferenceService { public List getFuzzyInference(Map vals) { return getFuzzyInference(getDemoRules(), vals, List.of(new Variable("возраст", List.of( - new VariableValue("молодой", 35.0), - new VariableValue("средний", 60.0), - new VariableValue("старый", 100.0)) + new FuzzyTerm("молодой", 35.0), + new FuzzyTerm("средний", 60.0), + new FuzzyTerm("старый", 100.0)) ), new Variable("доход", List.of( - new VariableValue("небольшой", 35000.0), - new VariableValue("средний", 100000.0), - new VariableValue("высокий", 500000.0)) + new FuzzyTerm("небольшой", 35000.0), + new FuzzyTerm("средний", 100000.0), + new FuzzyTerm("высокий", 500000.0)) ) ), new Variable("кредит", List.of( - new VariableValue("небольшой", 20000.0), - new VariableValue("средний", 100000.0), - new VariableValue("большой", 1000000.0))) + new FuzzyTerm("небольшой", 20000.0), + new FuzzyTerm("средний", 100000.0), + new FuzzyTerm("большой", 1000000.0))) ); } diff --git a/src/main/java/ru/ulstu/fc/rule/service/FuzzyRuleService.java b/src/main/java/ru/ulstu/fc/rule/service/FuzzyRuleService.java new file mode 100644 index 0000000..6f2d1c6 --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/service/FuzzyRuleService.java @@ -0,0 +1,42 @@ +package ru.ulstu.fc.rule.service; + +import org.springframework.stereotype.Service; + +import ru.ulstu.fc.rule.repository.FuzzyRuleRepository; +import ru.ulstu.fc.project.service.ProjectService; +import ru.ulstu.fc.rule.model.FuzzyRule; +import ru.ulstu.fc.rule.model.FuzzyRuleForm; + +@Service +public class FuzzyRuleService { + private final FuzzyRuleRepository ruleRepository; + private final ProjectService projectService; + + public FuzzyRuleService(FuzzyRuleRepository ruleRepository, ProjectService projectService) { + this.ruleRepository = ruleRepository; + this.projectService = projectService; + } + + public FuzzyRule getById(Integer id) { + return ruleRepository + .findById(id) + .orElseThrow(() -> new RuntimeException("Rule not found by id")); + } + + public Object save(FuzzyRuleForm ruleForm) { + FuzzyRule rule; + if (ruleForm.getId() == null || ruleForm.getId() == 0) { + rule = new FuzzyRule(); + } else { + rule = getById(ruleForm.getId()); + } + rule.setProject(projectService.getById(ruleForm.getProjectId())); + rule.setContent(ruleForm.getContent()); + return ruleRepository.save(rule); + } + + public void delete(FuzzyRuleForm ruleForm) { + getById(ruleForm.getId()); + ruleRepository.deleteById(ruleForm.getId()); + } +} diff --git a/src/main/java/ru/ulstu/fc/rule/service/RuleService.java b/src/main/java/ru/ulstu/fc/rule/service/RuleService.java deleted file mode 100644 index 929892a..0000000 --- a/src/main/java/ru/ulstu/fc/rule/service/RuleService.java +++ /dev/null @@ -1,43 +0,0 @@ -package ru.ulstu.fc.rule.service; - -import org.springframework.stereotype.Service; - -import ru.ulstu.fc.project.repository.RuleRepository; -import ru.ulstu.fc.project.service.ProjectService; -import ru.ulstu.fc.rule.model.Rule; -import ru.ulstu.fc.rule.model.RuleForm; - -@Service -public class RuleService { - private final RuleRepository ruleRepository; - private final ProjectService projectService; - - public RuleService(RuleRepository ruleRepository, ProjectService projectService) { - this.ruleRepository = ruleRepository; - this.projectService = projectService; - } - - public Rule getById(Integer id) { - return ruleRepository - .findById(id) - .orElseThrow(() -> new RuntimeException("Rule not found by id")); - } - - public Object save(RuleForm ruleForm) { - if (ruleForm.getId() == null) { - Rule rule = new Rule(); - rule.setProject(projectService.getById(ruleForm.getProjectId())); - // rule.set... - return ruleRepository.save(rule); - } - Rule dbRule = getById(ruleForm.getId()); - dbRule.setProject(projectService.getById(ruleForm.getProjectId())); - // dbRule.set ... - return ruleRepository.save(dbRule); - } - - public void delete(RuleForm ruleForm) { - getById(ruleForm.getId()); - ruleRepository.deleteById(ruleForm.getId()); - } -} diff --git a/src/main/java/ru/ulstu/fc/rule/service/VariableService.java b/src/main/java/ru/ulstu/fc/rule/service/VariableService.java new file mode 100644 index 0000000..322d5c7 --- /dev/null +++ b/src/main/java/ru/ulstu/fc/rule/service/VariableService.java @@ -0,0 +1,43 @@ +package ru.ulstu.fc.rule.service; + +import org.springframework.stereotype.Service; + +import ru.ulstu.fc.project.service.ProjectService; +import ru.ulstu.fc.rule.model.Variable; +import ru.ulstu.fc.rule.model.VariableForm; +import ru.ulstu.fc.rule.repository.VariableRepository; + +@Service +public class VariableService { + private final VariableRepository variableRepository; + private final ProjectService projectService; + + public VariableService(VariableRepository variableRepository, ProjectService projectService) { + this.variableRepository = variableRepository; + this.projectService = projectService; + } + + public Variable getById(Integer id) { + return variableRepository + .findById(id) + .orElseThrow(() -> new RuntimeException("Variable not found by id")); + } + + public Variable save(VariableForm variableForm) { + Variable variable; + if (variableForm.getId() == null || variableForm.getId() == 0) { + variable = new Variable(); + } else { + variable = getById(variableForm.getId()); + } + variable.setProject(projectService.getById(variableForm.getProjectId())); + variable.setName(variableForm.getName()); + variable.setInput(variableForm.isInput()); + return variableRepository.save(variable); + } + + public void delete(VariableForm ruleForm) { + getById(ruleForm.getId()); + variableRepository.deleteById(ruleForm.getId()); + } +} diff --git a/src/main/java/ru/ulstu/fc/user/controller/UserController.java b/src/main/java/ru/ulstu/fc/user/controller/UserController.java index 97fe0d6..c238db5 100644 --- a/src/main/java/ru/ulstu/fc/user/controller/UserController.java +++ b/src/main/java/ru/ulstu/fc/user/controller/UserController.java @@ -7,7 +7,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.context.request.WebRequest; -import org.springframework.web.servlet.ModelAndView; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; diff --git a/src/main/java/ru/ulstu/fc/user/model/User.java b/src/main/java/ru/ulstu/fc/user/model/User.java index 1c81271..352808e 100644 --- a/src/main/java/ru/ulstu/fc/user/model/User.java +++ b/src/main/java/ru/ulstu/fc/user/model/User.java @@ -1,21 +1,20 @@ package ru.ulstu.fc.user.model; +import java.util.HashSet; +import java.util.Set; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import jakarta.persistence.Table; -import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; import ru.ulstu.fc.config.Constants; import ru.ulstu.fc.core.model.BaseEntity; -import java.util.HashSet; -import java.util.Set; - @Entity @Table(name = "is_users") public class User extends BaseEntity { diff --git a/src/main/java/ru/ulstu/fc/user/service/IpAddressResolver.java b/src/main/java/ru/ulstu/fc/user/service/IpAddressResolver.java index 51a0f36..ae95a27 100644 --- a/src/main/java/ru/ulstu/fc/user/service/IpAddressResolver.java +++ b/src/main/java/ru/ulstu/fc/user/service/IpAddressResolver.java @@ -1,19 +1,18 @@ package ru.ulstu.fc.user.service; import jakarta.servlet.http.HttpServletRequest; -import org.springframework.util.StringUtils; public final class IpAddressResolver { - private static final String CLIENT_IP_HEADER = "Client-IP"; - private static final String FORWARDED_FOR_HEADER = "X-Forwarded-For"; + //private static final String CLIENT_IP_HEADER = "Client-IP"; + //private static final String FORWARDED_FOR_HEADER = "X-Forwarded-For"; public static String getRemoteAddr(HttpServletRequest request) { String headerClientIp = request.getHeader(""); String headerXForwardedFor = request.getHeader(HttpServletRequest.FORM_AUTH); - if (StringUtils.isEmpty(request.getRemoteAddr()) && !StringUtils.isEmpty(headerClientIp)) { + if (request.getRemoteAddr().isEmpty() && !headerClientIp.isEmpty()) { return headerClientIp; } - if (!StringUtils.isEmpty(headerXForwardedFor)) { + if (!headerXForwardedFor.isEmpty()) { return headerXForwardedFor; } return request.getRemoteAddr(); diff --git a/src/main/java/ru/ulstu/fc/user/service/UserSessionLoginHandler.java b/src/main/java/ru/ulstu/fc/user/service/UserSessionLoginHandler.java index b05710d..44d7904 100644 --- a/src/main/java/ru/ulstu/fc/user/service/UserSessionLoginHandler.java +++ b/src/main/java/ru/ulstu/fc/user/service/UserSessionLoginHandler.java @@ -1,21 +1,21 @@ package ru.ulstu.fc.user.service; +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.stereotype.Component; + import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.AuthenticationSuccessHandler; -import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; -import org.springframework.stereotype.Component; import ru.ulstu.fc.config.Constants; -import java.io.IOException; - @Component -public class UserSessionLoginHandler extends SavedRequestAwareAuthenticationSuccessHandler implements AuthenticationSuccessHandler { +public class UserSessionLoginHandler extends SavedRequestAwareAuthenticationSuccessHandler { private final Logger log = LoggerFactory.getLogger(UserSessionLoginHandler.class); private final UserSessionService userSessionService; diff --git a/src/main/java/ru/ulstu/fc/user/service/UserSessionLogoutHandler.java b/src/main/java/ru/ulstu/fc/user/service/UserSessionLogoutHandler.java index 98d50fe..9703e9e 100644 --- a/src/main/java/ru/ulstu/fc/user/service/UserSessionLogoutHandler.java +++ b/src/main/java/ru/ulstu/fc/user/service/UserSessionLogoutHandler.java @@ -1,21 +1,21 @@ package ru.ulstu.fc.user.service; +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; +import org.springframework.stereotype.Component; + import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; -import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; -import org.springframework.stereotype.Component; import ru.ulstu.fc.config.Constants; -import java.io.IOException; - @Component -public class UserSessionLogoutHandler extends SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler { +public class UserSessionLogoutHandler extends SimpleUrlLogoutSuccessHandler { private final Logger log = LoggerFactory.getLogger(UserSessionLogoutHandler.class); private final UserSessionService userSessionService; diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 9ac57fb..1208e58 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -29,7 +29,7 @@ data-width="90%"> @@ -44,7 +44,7 @@ data-width="90%"> diff --git a/src/main/resources/templates/project/edit.html b/src/main/resources/templates/project/edit.html index ed29db0..bfca1c3 100644 --- a/src/main/resources/templates/project/edit.html +++ b/src/main/resources/templates/project/edit.html @@ -1,10 +1,10 @@ - + + Редактирование проекта - +

Редактирование проекта:

@@ -12,14 +12,8 @@
- -

+ +

Не может быть пустым

@@ -27,22 +21,38 @@
- Отмена -
-

Список правил

-
-
- +
+
+
+

Список переменных

+
+
+
+ + + +
+
+
+ Добавить преременную
-
+
+

Список правил

+
+
+
+ + + +
+
+ +
+ Добавить правило
- Добавить правило -
- + + \ No newline at end of file diff --git a/src/main/resources/templates/rule/edit.html b/src/main/resources/templates/rule/edit.html index 81b03d1..1b16584 100644 --- a/src/main/resources/templates/rule/edit.html +++ b/src/main/resources/templates/rule/edit.html @@ -8,12 +8,21 @@

Редактирование правила:

-
- + +
- - + + +

+ Не может быть пустым +

diff --git a/src/main/resources/templates/var/edit.html b/src/main/resources/templates/var/edit.html new file mode 100644 index 0000000..37722ba --- /dev/null +++ b/src/main/resources/templates/var/edit.html @@ -0,0 +1,46 @@ + + + + Редактирование переменной + + +
+

Редактирование переменной:

+ + + +
+ + +

+ Не может быть пустым +

+
+ +
+ + +
+ + + + Отмена + +
+